summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/contributions.txt14
-rw-r--r--indra/cmake/Variables.cmake31
-rw-r--r--indra/integration_tests/llui_libtest/llwidgetreg.cpp2
-rw-r--r--indra/llaudio/CMakeLists.txt12
-rw-r--r--indra/llaudio/llstreamingaudio_fmod.cpp2
-rw-r--r--indra/llcharacter/llanimationstates.cpp162
-rw-r--r--indra/llcharacter/llanimationstates.h286
-rw-r--r--indra/llcharacter/llkeyframemotion.cpp7
-rw-r--r--indra/llcharacter/llkeyframewalkmotion.cpp47
-rw-r--r--indra/llcharacter/llmotioncontroller.cpp29
-rw-r--r--indra/llcharacter/llmotioncontroller.h5
-rw-r--r--indra/llcommon/CMakeLists.txt2
-rw-r--r--indra/llcommon/llapp.h2
-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.h2
-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/llerror.cpp16
-rw-r--r--indra/llcommon/llfasttimer.h24
-rw-r--r--indra/llcommon/llfasttimer_class.cpp6
-rw-r--r--indra/llcommon/llprocessor.cpp11
-rw-r--r--indra/llcommon/llqueuedthread.cpp5
-rw-r--r--indra/llcommon/llstring.cpp14
-rw-r--r--indra/llcommon/llstring.h4
-rw-r--r--indra/llcommon/llsys.cpp14
-rw-r--r--indra/llcommon/llsys.h5
-rw-r--r--indra/llcommon/lltimer.cpp2
-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.h2
-rw-r--r--indra/llcommon/llversionviewer.h4
-rw-r--r--indra/llcommon/llworkerthread.cpp4
-rw-r--r--indra/llimage/CMakeLists.txt2
-rw-r--r--indra/llimage/llimage.cpp32
-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/llinventory/CMakeLists.txt2
-rw-r--r--indra/llinventory/llinventory.cpp81
-rw-r--r--indra/llinventory/llinventory.h297
-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/llmath/v2math.h9
-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.cpp29
-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.cpp20
-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/llplugin/CMakeLists.txt19
-rw-r--r--indra/llplugin/llpluginclassmedia.cpp65
-rw-r--r--indra/llplugin/llpluginclassmedia.h19
-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.cpp121
-rw-r--r--indra/llplugin/llpluginmessagepipe.h9
-rw-r--r--indra/llplugin/llpluginprocesschild.cpp79
-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/llfontgl.cpp2
-rw-r--r--indra/llrender/llfontregistry.cpp2
-rw-r--r--indra/llrender/llimagegl.cpp44
-rw-r--r--indra/llrender/llimagegl.h2
-rw-r--r--indra/llrender/llrender.cpp50
-rw-r--r--indra/llui/CMakeLists.txt4
-rw-r--r--indra/llui/llaccordionctrl.cpp64
-rw-r--r--indra/llui/llaccordionctrl.h1
-rw-r--r--indra/llui/llaccordionctrltab.cpp103
-rw-r--r--indra/llui/llaccordionctrltab.h13
-rw-r--r--indra/llui/llbutton.cpp7
-rw-r--r--indra/llui/llbutton.h3
-rw-r--r--indra/llui/llcombobox.cpp34
-rw-r--r--indra/llui/llcombobox.h3
-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.cpp326
-rw-r--r--indra/llui/llflatlistview.h87
-rw-r--r--indra/llui/llfloater.cpp67
-rw-r--r--indra/llui/llfloater.h19
-rw-r--r--indra/llui/lliconctrl.h1
-rw-r--r--indra/llui/lllineeditor.cpp120
-rw-r--r--indra/llui/lllineeditor.h4
-rw-r--r--indra/llui/llloadingindicator.cpp133
-rw-r--r--indra/llui/llloadingindicator.h93
-rw-r--r--indra/llui/llmenugl.cpp25
-rw-r--r--indra/llui/llmenugl.h2
-rw-r--r--indra/llui/llmultifloater.cpp9
-rw-r--r--indra/llui/llnotifications.cpp204
-rw-r--r--indra/llui/llnotifications.h108
-rw-r--r--indra/llui/llradiogroup.cpp8
-rw-r--r--indra/llui/llresizebar.cpp5
-rw-r--r--indra/llui/llscrollingpanellist.cpp28
-rw-r--r--indra/llui/llscrollingpanellist.h6
-rw-r--r--indra/llui/llscrolllistctrl.cpp15
-rw-r--r--indra/llui/llscrolllistctrl.h2
-rw-r--r--indra/llui/llsearcheditor.h2
-rw-r--r--indra/llui/llsliderctrl.cpp8
-rw-r--r--indra/llui/llsliderctrl.h2
-rw-r--r--indra/llui/llspinctrl.cpp5
-rw-r--r--indra/llui/llspinctrl.h1
-rw-r--r--indra/llui/lltextbase.cpp52
-rw-r--r--indra/llui/lltextbase.h1
-rw-r--r--indra/llui/lltexteditor.cpp248
-rw-r--r--indra/llui/lltexteditor.h12
-rw-r--r--indra/llui/lltextutil.cpp79
-rw-r--r--indra/llui/lltextutil.h72
-rw-r--r--indra/llui/llui.cpp13
-rw-r--r--indra/llui/llui.h2
-rw-r--r--indra/llui/lluictrlfactory.cpp5
-rw-r--r--indra/llui/lluifwd.h1
-rw-r--r--indra/llui/llurlaction.cpp17
-rw-r--r--indra/llui/llurlaction.h3
-rw-r--r--indra/llui/llurlentry.cpp150
-rw-r--r--indra/llui/llurlentry.h28
-rw-r--r--indra/llui/llurlregistry.cpp8
-rw-r--r--indra/llui/llview.cpp63
-rw-r--r--indra/llui/llview.h3
-rw-r--r--indra/llui/tests/llurlentry_test.cpp26
-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/llwindow.cpp27
-rw-r--r--indra/llwindow/llwindow.h17
-rw-r--r--indra/llwindow/llwindowmacosx-objc.h3
-rw-r--r--indra/llwindow/llwindowmacosx-objc.mm19
-rw-r--r--indra/llwindow/llwindowmacosx.cpp59
-rw-r--r--indra/llwindow/llwindowmacosx.h4
-rw-r--r--indra/llwindow/llwindowsdl.cpp219
-rw-r--r--indra/llwindow/llwindowsdl.h5
-rw-r--r--indra/llwindow/llwindowwin32.cpp115
-rw-r--r--indra/llwindow/llwindowwin32.h5
-rw-r--r--indra/llxuixml/llinitparam.cpp22
-rw-r--r--indra/llxuixml/llinitparam.h172
-rw-r--r--indra/lscript/lscript_execute/lscript_execute.cpp2
-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/media_plugin_gstreamer010.cpp58
-rw-r--r--indra/media_plugins/quicktime/media_plugin_quicktime.cpp66
-rw-r--r--indra/media_plugins/webkit/CMakeLists.txt27
-rw-r--r--indra/media_plugins/webkit/dummy_volume_catcher.cpp63
-rw-r--r--indra/media_plugins/webkit/linux_volume_catcher.cpp72
-rw-r--r--indra/media_plugins/webkit/mac_volume_catcher.cpp273
-rw-r--r--indra/media_plugins/webkit/media_plugin_webkit.cpp334
-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.txt120
-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/keywords.ini1
-rw-r--r--indra/newview/app_settings/logcontrol.xml1
-rw-r--r--indra/newview/app_settings/low_graphics.xml2
-rw-r--r--indra/newview/app_settings/settings.xml521
-rw-r--r--indra/newview/app_settings/settings_per_account.xml56
-rw-r--r--indra/newview/character/avatar_lad.xml264
-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.txt19
-rw-r--r--indra/newview/featuretable_linux.txt13
-rw-r--r--indra/newview/featuretable_mac.txt13
-rw-r--r--indra/newview/featuretable_solaris.txt1
-rw-r--r--indra/newview/gpu_table.txt91
-rw-r--r--indra/newview/installers/darwin/release-dmg/_DS_Storebin12292 -> 12292 bytes
-rw-r--r--indra/newview/installers/windows/installer_template.nsi6
-rw-r--r--indra/newview/llagent.cpp3177
-rw-r--r--indra/newview/llagent.h353
-rw-r--r--indra/newview/llagentcamera.cpp2849
-rw-r--r--indra/newview/llagentcamera.h400
-rw-r--r--indra/newview/llagentlistener.cpp5
-rw-r--r--indra/newview/llagentui.cpp28
-rw-r--r--indra/newview/llagentui.h4
-rw-r--r--indra/newview/llagentwearables.cpp1455
-rw-r--r--indra/newview/llagentwearables.h100
-rw-r--r--indra/newview/llagentwearablesfetch.cpp527
-rw-r--r--indra/newview/llagentwearablesfetch.h118
-rw-r--r--indra/newview/llappearancemgr.cpp1109
-rw-r--r--indra/newview/llappearancemgr.h92
-rw-r--r--indra/newview/llappviewer.cpp381
-rw-r--r--indra/newview/llappviewer.h3
-rw-r--r--indra/newview/llappviewerlinux.cpp2
-rw-r--r--indra/newview/llappviewermacosx.cpp51
-rw-r--r--indra/newview/llappviewerwin32.cpp10
-rw-r--r--indra/newview/llassetuploadresponders.cpp41
-rw-r--r--indra/newview/llassetuploadresponders.h12
-rw-r--r--indra/newview/llaudiosourcevo.cpp4
-rw-r--r--indra/newview/llavataractions.cpp152
-rw-r--r--indra/newview/llavataractions.h19
-rw-r--r--indra/newview/llavatarlist.cpp163
-rw-r--r--indra/newview/llavatarlist.h50
-rw-r--r--indra/newview/llavatarlistitem.cpp27
-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.cpp591
-rw-r--r--indra/newview/llbottomtray.h204
-rw-r--r--indra/newview/llbuycurrencyhtml.cpp165
-rw-r--r--indra/newview/llbuycurrencyhtml.h57
-rw-r--r--indra/newview/llcallfloater.cpp68
-rw-r--r--indra/newview/llcallingcard.cpp1
-rw-r--r--indra/newview/llchannelmanager.cpp61
-rw-r--r--indra/newview/llchannelmanager.h5
-rw-r--r--indra/newview/llchatbar.cpp14
-rw-r--r--indra/newview/llchathistory.cpp39
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp14
-rw-r--r--indra/newview/llchiclet.cpp208
-rw-r--r--indra/newview/llchiclet.h70
-rw-r--r--indra/newview/llcloud.cpp22
-rw-r--r--indra/newview/llcofwearables.cpp457
-rw-r--r--indra/newview/llcofwearables.h159
-rw-r--r--indra/newview/llcompilequeue.cpp26
-rw-r--r--indra/newview/llcompilequeue.h12
-rw-r--r--indra/newview/llcurrencyuimanager.cpp2
-rw-r--r--indra/newview/lldateutil.cpp35
-rw-r--r--indra/newview/lldateutil.h23
-rw-r--r--indra/newview/lldrawpool.cpp1
-rw-r--r--indra/newview/lldrawpoolbump.cpp3
-rw-r--r--indra/newview/lldrawpooltree.cpp15
-rw-r--r--indra/newview/lldriverparam.cpp17
-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/llexpandabletextbox.cpp3
-rw-r--r--indra/newview/llexpandabletextbox.h1
-rw-r--r--indra/newview/llface.cpp16
-rw-r--r--indra/newview/llfavoritesbar.cpp36
-rw-r--r--indra/newview/llfeaturemanager.cpp148
-rw-r--r--indra/newview/llfeaturemanager.h6
-rw-r--r--indra/newview/llfilteredwearablelist.cpp111
-rw-r--r--indra/newview/llfilteredwearablelist.h70
-rw-r--r--indra/newview/llfloaterabout.cpp14
-rw-r--r--indra/newview/llfloateranimpreview.cpp19
-rw-r--r--indra/newview/llfloateranimpreview.h2
-rw-r--r--indra/newview/llfloaterauction.cpp3
-rw-r--r--indra/newview/llfloateravatarpicker.cpp88
-rw-r--r--indra/newview/llfloateravatarpicker.h12
-rw-r--r--indra/newview/llfloateravatartextures.cpp121
-rw-r--r--indra/newview/llfloaterbulkpermission.cpp9
-rw-r--r--indra/newview/llfloaterbulkpermission.h4
-rw-r--r--indra/newview/llfloaterbuy.cpp20
-rw-r--r--indra/newview/llfloaterbuy.h2
-rw-r--r--indra/newview/llfloaterbuycontents.cpp14
-rw-r--r--indra/newview/llfloaterbuycontents.h2
-rw-r--r--indra/newview/llfloaterbuycurrency.cpp3
-rw-r--r--indra/newview/llfloaterbuycurrencyhtml.cpp119
-rw-r--r--indra/newview/llfloaterbuycurrencyhtml.h65
-rw-r--r--indra/newview/llfloaterbuyland.cpp13
-rw-r--r--indra/newview/llfloatercamera.cpp20
-rw-r--r--indra/newview/llfloaterchat.cpp2
-rw-r--r--indra/newview/llfloaterchatterbox.cpp2
-rw-r--r--indra/newview/llfloaterevent.cpp3
-rw-r--r--indra/newview/llfloatergesture.cpp73
-rw-r--r--indra/newview/llfloatergesture.h2
-rw-r--r--indra/newview/llfloatergodtools.cpp44
-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/llfloaterhud.cpp3
-rw-r--r--indra/newview/llfloaterimagepreview.cpp44
-rw-r--r--indra/newview/llfloaterimagepreview.h7
-rw-r--r--indra/newview/llfloaterinventory.cpp40
-rw-r--r--indra/newview/llfloaterinventory.h4
-rw-r--r--indra/newview/llfloaterlagmeter.cpp2
-rw-r--r--indra/newview/llfloaterland.cpp44
-rw-r--r--indra/newview/llfloaterland.h11
-rw-r--r--indra/newview/llfloatermap.cpp29
-rw-r--r--indra/newview/llfloatermap.h2
-rw-r--r--indra/newview/llfloaternamedesc.cpp6
-rw-r--r--indra/newview/llfloaternotificationsconsole.cpp2
-rw-r--r--indra/newview/llfloateropenobject.cpp4
-rw-r--r--indra/newview/llfloaterpreference.cpp98
-rw-r--r--indra/newview/llfloaterproperties.cpp22
-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.cpp112
-rw-r--r--indra/newview/llfloaterscriptlimits.h5
-rw-r--r--indra/newview/llfloatersellland.cpp12
-rw-r--r--indra/newview/llfloatersnapshot.cpp666
-rw-r--r--indra/newview/llfloatersnapshot.h16
-rw-r--r--indra/newview/llfloatertools.cpp11
-rw-r--r--indra/newview/llfloatertools.h4
-rw-r--r--indra/newview/llfloatertopobjects.cpp2
-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.cpp14
-rw-r--r--indra/newview/llfloaterurlentry.cpp8
-rw-r--r--indra/newview/llfloatervoicedevicesettings.cpp41
-rw-r--r--indra/newview/llfloaterworldmap.cpp34
-rw-r--r--indra/newview/llfloaterworldmap.h3
-rw-r--r--indra/newview/llfolderview.cpp53
-rw-r--r--indra/newview/llfolderview.h10
-rw-r--r--indra/newview/llfoldervieweventlistener.h2
-rw-r--r--indra/newview/llfolderviewitem.cpp358
-rw-r--r--indra/newview/llfolderviewitem.h2
-rw-r--r--indra/newview/llfriendcard.cpp20
-rw-r--r--indra/newview/llfriendcard.h2
-rw-r--r--indra/newview/llgesturemgr.cpp99
-rw-r--r--indra/newview/llgesturemgr.h8
-rw-r--r--indra/newview/llgiveinventory.cpp541
-rw-r--r--indra/newview/llgiveinventory.h99
-rw-r--r--indra/newview/llglsandbox.cpp93
-rw-r--r--indra/newview/llgroupactions.cpp13
-rw-r--r--indra/newview/llgroupactions.h5
-rw-r--r--indra/newview/llgrouplist.cpp36
-rw-r--r--indra/newview/llgrouplist.h22
-rw-r--r--indra/newview/llgroupmgr.cpp31
-rw-r--r--indra/newview/llgroupmgr.h12
-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.cpp4
-rw-r--r--indra/newview/llimfloater.cpp129
-rw-r--r--indra/newview/llimfloater.h11
-rw-r--r--indra/newview/llimpanel.cpp14
-rw-r--r--indra/newview/llimview.cpp139
-rw-r--r--indra/newview/llimview.h23
-rw-r--r--indra/newview/llinspectavatar.cpp30
-rw-r--r--indra/newview/llinspectobject.cpp6
-rw-r--r--indra/newview/llinspectremoteobject.cpp4
-rw-r--r--indra/newview/llinventorybridge.cpp1895
-rw-r--r--indra/newview/llinventorybridge.h556
-rw-r--r--indra/newview/llinventoryfilter.cpp60
-rw-r--r--indra/newview/llinventoryfilter.h9
-rw-r--r--indra/newview/llinventoryfunctions.cpp484
-rw-r--r--indra/newview/llinventoryfunctions.h256
-rw-r--r--indra/newview/llinventoryicon.cpp187
-rw-r--r--indra/newview/llinventoryicon.h108
-rw-r--r--indra/newview/llinventoryitemslist.cpp458
-rw-r--r--indra/newview/llinventoryitemslist.h282
-rw-r--r--indra/newview/llinventorymodel.cpp1117
-rw-r--r--indra/newview/llinventorymodel.h894
-rw-r--r--indra/newview/llinventorymodelbackgroundfetch.cpp627
-rw-r--r--indra/newview/llinventorymodelbackgroundfetch.h134
-rw-r--r--indra/newview/llinventoryobserver.cpp529
-rw-r--r--indra/newview/llinventoryobserver.h269
-rw-r--r--indra/newview/llinventorypanel.cpp163
-rw-r--r--indra/newview/llinventorypanel.h19
-rw-r--r--indra/newview/lljoystickbutton.cpp49
-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/lllocationinputctrl.cpp90
-rw-r--r--indra/newview/lllocationinputctrl.h21
-rw-r--r--indra/newview/llloginhandler.cpp200
-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/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.cpp106
-rw-r--r--indra/newview/llmediactrl.h9
-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.cpp50
-rw-r--r--indra/newview/llmoveview.h3
-rw-r--r--indra/newview/llmutelist.cpp78
-rw-r--r--indra/newview/llmutelist.h13
-rw-r--r--indra/newview/llnamelistctrl.cpp33
-rw-r--r--indra/newview/llnavigationbar.cpp35
-rw-r--r--indra/newview/llnearbychat.cpp17
-rw-r--r--indra/newview/llnearbychat.h2
-rw-r--r--indra/newview/llnearbychatbar.cpp92
-rw-r--r--indra/newview/llnearbychatbar.h3
-rw-r--r--indra/newview/llnearbychathandler.cpp74
-rw-r--r--indra/newview/llnetmap.cpp13
-rw-r--r--indra/newview/llnetmap.h4
-rw-r--r--indra/newview/llnotificationhandler.h45
-rw-r--r--indra/newview/llnotificationhandlerutil.cpp203
-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.cpp49
-rw-r--r--indra/newview/lloutfitslist.cpp504
-rw-r--r--indra/newview/lloutfitslist.h128
-rw-r--r--indra/newview/lloutputmonitorctrl.cpp8
-rw-r--r--indra/newview/lloutputmonitorctrl.h2
-rw-r--r--indra/newview/lloverlaybar.cpp2
-rw-r--r--indra/newview/llpanelavatar.cpp26
-rw-r--r--indra/newview/llpanelavatar.h1
-rw-r--r--indra/newview/llpanelblockedlist.cpp15
-rw-r--r--indra/newview/llpanelblockedlist.h2
-rw-r--r--indra/newview/llpanelclassified.cpp6
-rw-r--r--indra/newview/llpanelcontents.cpp3
-rw-r--r--indra/newview/llpaneleditwearable.cpp787
-rw-r--r--indra/newview/llpaneleditwearable.h43
-rw-r--r--indra/newview/llpanelgenerictip.cpp51
-rw-r--r--indra/newview/llpanelgenerictip.h57
-rw-r--r--indra/newview/llpanelgroup.cpp84
-rw-r--r--indra/newview/llpanelgroup.h8
-rw-r--r--indra/newview/llpanelgroupgeneral.cpp13
-rw-r--r--indra/newview/llpanelgroupgeneral.h1
-rw-r--r--indra/newview/llpanelgroupinvite.cpp12
-rw-r--r--indra/newview/llpanelgroupinvite.h2
-rw-r--r--indra/newview/llpanelgrouplandmoney.cpp5
-rw-r--r--indra/newview/llpanelgroupnotices.cpp35
-rw-r--r--indra/newview/llpanelgrouproles.cpp134
-rw-r--r--indra/newview/llpanelgrouproles.h12
-rw-r--r--indra/newview/llpanelimcontrolpanel.cpp5
-rw-r--r--indra/newview/llpanellandmarkinfo.cpp41
-rw-r--r--indra/newview/llpanellandmarks.cpp124
-rw-r--r--indra/newview/llpanellandmarks.h9
-rw-r--r--indra/newview/llpanellandmedia.cpp17
-rw-r--r--indra/newview/llpanellogin.cpp563
-rw-r--r--indra/newview/llpanellogin.h28
-rw-r--r--indra/newview/llpanelmaininventory.cpp73
-rw-r--r--indra/newview/llpanelmaininventory.h6
-rw-r--r--indra/newview/llpanelme.cpp10
-rw-r--r--indra/newview/llpanelme.h1
-rw-r--r--indra/newview/llpanelnearbymedia.cpp41
-rw-r--r--indra/newview/llpanelnearbymedia.h6
-rw-r--r--indra/newview/llpanelobjectinventory.cpp357
-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.cpp725
-rw-r--r--indra/newview/llpaneloutfitedit.h159
-rw-r--r--indra/newview/llpaneloutfitsinventory.cpp388
-rw-r--r--indra/newview/llpaneloutfitsinventory.h29
-rw-r--r--indra/newview/llpanelpeople.cpp89
-rw-r--r--indra/newview/llpanelpeople.h8
-rw-r--r--indra/newview/llpanelpeoplemenus.cpp75
-rw-r--r--indra/newview/llpanelpeoplemenus.h31
-rw-r--r--indra/newview/llpanelpermissions.cpp4
-rw-r--r--indra/newview/llpanelpick.cpp18
-rw-r--r--indra/newview/llpanelpick.h2
-rw-r--r--indra/newview/llpanelpicks.cpp14
-rw-r--r--indra/newview/llpanelplaceprofile.cpp10
-rw-r--r--indra/newview/llpanelplaces.cpp45
-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.cpp26
-rw-r--r--indra/newview/llpanelteleporthistory.cpp53
-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/llparticipantlist.cpp362
-rw-r--r--indra/newview/llparticipantlist.h17
-rw-r--r--indra/newview/llplacesinventorybridge.cpp13
-rw-r--r--indra/newview/llplacesinventorybridge.h38
-rw-r--r--indra/newview/llplacesinventorypanel.cpp35
-rw-r--r--indra/newview/llpopupview.cpp34
-rw-r--r--indra/newview/llpreview.cpp9
-rw-r--r--indra/newview/llpreviewanim.cpp23
-rw-r--r--indra/newview/llpreviewgesture.cpp37
-rw-r--r--indra/newview/llpreviewnotecard.cpp46
-rw-r--r--indra/newview/llpreviewnotecard.h5
-rw-r--r--indra/newview/llpreviewscript.cpp8
-rw-r--r--indra/newview/llprogressview.cpp26
-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/llscreenchannel.cpp65
-rw-r--r--indra/newview/llscreenchannel.h6
-rw-r--r--indra/newview/llscriptfloater.cpp12
-rw-r--r--indra/newview/llscriptfloater.h2
-rw-r--r--indra/newview/llscrollingpanelparam.cpp49
-rw-r--r--indra/newview/llscrollingpanelparam.h5
-rw-r--r--indra/newview/llsecapi.cpp197
-rw-r--r--indra/newview/llsecapi.h499
-rw-r--r--indra/newview/llsechandler_basic.cpp1613
-rw-r--r--indra/newview/llsechandler_basic.h285
-rw-r--r--indra/newview/llselectmgr.cpp108
-rw-r--r--indra/newview/llselectmgr.h4
-rw-r--r--indra/newview/llsidepanelappearance.cpp281
-rw-r--r--indra/newview/llsidepanelappearance.h32
-rw-r--r--indra/newview/llsidepanelinventory.cpp40
-rw-r--r--indra/newview/llsidepanelinventory.h2
-rw-r--r--indra/newview/llsidepaneliteminfo.cpp21
-rw-r--r--indra/newview/llsidepaneltaskinfo.cpp7
-rw-r--r--indra/newview/llsidepaneltaskinfo.h2
-rw-r--r--indra/newview/llsidetray.cpp63
-rw-r--r--indra/newview/llsidetray.h14
-rw-r--r--indra/newview/llslurl.cpp514
-rw-r--r--indra/newview/llslurl.h159
-rw-r--r--indra/newview/llspeakbutton.cpp10
-rw-r--r--indra/newview/llspeakers.cpp84
-rw-r--r--indra/newview/llspeakers.h16
-rw-r--r--indra/newview/llspeakingindicatormanager.cpp4
-rw-r--r--indra/newview/llstartup.cpp818
-rw-r--r--indra/newview/llstartup.h21
-rw-r--r--indra/newview/llstatusbar.cpp16
-rw-r--r--indra/newview/llstylemap.cpp2
-rw-r--r--indra/newview/llsurface.cpp3
-rw-r--r--indra/newview/llsyswellwindow.cpp115
-rw-r--r--indra/newview/llsyswellwindow.h20
-rw-r--r--indra/newview/llteleporthistory.cpp12
-rw-r--r--indra/newview/llteleporthistorystorage.cpp7
-rw-r--r--indra/newview/lltexlayer.cpp35
-rw-r--r--indra/newview/lltexlayer.h1
-rw-r--r--indra/newview/lltexlayerparams.cpp8
-rw-r--r--indra/newview/lltexturecache.cpp458
-rw-r--r--indra/newview/lltexturecache.h18
-rw-r--r--indra/newview/lltexturectrl.cpp76
-rw-r--r--indra/newview/lltexturectrl.h4
-rw-r--r--indra/newview/lltexturefetch.cpp116
-rw-r--r--indra/newview/lltexturefetch.h4
-rw-r--r--indra/newview/lltextureview.cpp11
-rw-r--r--indra/newview/lltoast.cpp100
-rw-r--r--indra/newview/lltoast.h45
-rw-r--r--indra/newview/lltoastalertpanel.cpp21
-rw-r--r--indra/newview/lltoastgroupnotifypanel.cpp5
-rw-r--r--indra/newview/lltoastnotifypanel.cpp215
-rw-r--r--indra/newview/lltoastnotifypanel.h44
-rw-r--r--indra/newview/lltoastpanel.cpp34
-rw-r--r--indra/newview/lltoastpanel.h10
-rw-r--r--indra/newview/lltoolcomp.cpp3
-rw-r--r--indra/newview/lltooldraganddrop.cpp919
-rw-r--r--indra/newview/lltooldraganddrop.h29
-rw-r--r--indra/newview/lltoolfocus.cpp55
-rw-r--r--indra/newview/lltoolgrab.cpp53
-rw-r--r--indra/newview/lltoolgun.cpp3
-rw-r--r--indra/newview/lltoolmgr.cpp19
-rw-r--r--indra/newview/lltoolmorph.cpp61
-rw-r--r--indra/newview/lltoolmorph.h5
-rw-r--r--indra/newview/lltoolpie.cpp82
-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/llurl.cpp6
-rw-r--r--indra/newview/llurl.h1
-rw-r--r--indra/newview/llurldispatcher.cpp202
-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/llvieweraudio.cpp21
-rw-r--r--indra/newview/llviewercamera.cpp3
-rw-r--r--indra/newview/llviewercontrol.cpp52
-rw-r--r--indra/newview/llviewerdisplay.cpp28
-rw-r--r--indra/newview/llviewerfloaterreg.cpp5
-rw-r--r--indra/newview/llviewerinventory.cpp184
-rw-r--r--indra/newview/llviewerinventory.h14
-rw-r--r--indra/newview/llviewerjoystick.cpp9
-rw-r--r--indra/newview/llviewerkeyboard.cpp97
-rw-r--r--indra/newview/llviewermedia.cpp519
-rw-r--r--indra/newview/llviewermedia.h32
-rw-r--r--indra/newview/llviewermediafocus.cpp65
-rw-r--r--indra/newview/llviewermenu.cpp505
-rw-r--r--indra/newview/llviewermenu.h1
-rw-r--r--indra/newview/llviewermenufile.cpp145
-rw-r--r--indra/newview/llviewermenufile.h14
-rw-r--r--indra/newview/llviewermessage.cpp763
-rw-r--r--indra/newview/llviewermessage.h35
-rw-r--r--indra/newview/llviewernetwork.cpp721
-rw-r--r--indra/newview/llviewernetwork.h182
-rw-r--r--indra/newview/llviewerobject.cpp65
-rw-r--r--indra/newview/llviewerobject.h6
-rw-r--r--indra/newview/llviewerobjectlist.cpp25
-rw-r--r--indra/newview/llviewerparcelmedia.cpp52
-rw-r--r--indra/newview/llviewerparcelmediaautoplay.cpp19
-rw-r--r--indra/newview/llviewerparcelmgr.cpp3
-rw-r--r--indra/newview/llviewerparceloverlay.cpp6
-rw-r--r--indra/newview/llviewerregion.cpp23
-rw-r--r--indra/newview/llviewerregion.h3
-rw-r--r--indra/newview/llviewerstats.cpp17
-rw-r--r--indra/newview/llviewertexteditor.cpp7
-rw-r--r--indra/newview/llviewertexture.cpp72
-rw-r--r--indra/newview/llviewertexture.h4
-rw-r--r--indra/newview/llviewervisualparam.cpp4
-rw-r--r--indra/newview/llviewerwindow.cpp879
-rw-r--r--indra/newview/llvoavatar.cpp450
-rw-r--r--indra/newview/llvoavatar.h58
-rw-r--r--indra/newview/llvoavatardefines.cpp64
-rw-r--r--indra/newview/llvoavatardefines.h8
-rw-r--r--indra/newview/llvoavatarself.cpp395
-rw-r--r--indra/newview/llvoavatarself.h65
-rw-r--r--indra/newview/llvograss.cpp4
-rw-r--r--indra/newview/llvoicechannel.cpp75
-rw-r--r--indra/newview/llvoicechannel.h3
-rw-r--r--indra/newview/llvoiceclient.cpp7190
-rw-r--r--indra/newview/llvoiceclient.h1031
-rw-r--r--indra/newview/llvoicevivox.cpp6944
-rw-r--r--indra/newview/llvoicevivox.h917
-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/llvotree.cpp42
-rw-r--r--indra/newview/llvotree.h1
-rw-r--r--indra/newview/llvovolume.cpp17
-rw-r--r--indra/newview/llwaterparammanager.cpp3
-rw-r--r--indra/newview/llwearable.cpp216
-rw-r--r--indra/newview/llwearable.h13
-rw-r--r--indra/newview/llwearableitemslist.cpp553
-rw-r--r--indra/newview/llwearableitemslist.h320
-rw-r--r--indra/newview/llwearablelist.cpp8
-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.cpp35
-rw-r--r--indra/newview/llweb.h4
-rw-r--r--indra/newview/llworld.cpp44
-rw-r--r--indra/newview/llworld.h4
-rw-r--r--indra/newview/llworldmapview.cpp69
-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.cpp113
-rw-r--r--indra/newview/llxmlrpctransaction.h3
-rw-r--r--indra/newview/macview_Prefix.h1
-rw-r--r--indra/newview/pipeline.cpp75
-rw-r--r--indra/newview/pipeline.h4
-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.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/skins/default/colors.xml25
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Left_Off.pngbin0 -> 47887 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Left_On.pngbin0 -> 47995 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Right_Off.pngbin0 -> 48333 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Right_On.pngbin0 -> 47187 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_Large.pngbin2282 -> 7905 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_Object_Multi.pngbin0 -> 774 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/UpArrow_Off.pngbin0 -> 219 bytes
-rw-r--r--indra/newview/skins/default/textures/locked_image.j2cbin6140 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/map_infohub.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/BuyArrow_Over.pngbin508 -> 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.xml281
-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 -> 54754 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/buy_over.pngbin0 -> 54772 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/buy_press.pngbin0 -> 54861 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Dragbar.pngbin0 -> 348 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/xui/da/floater_about.xml9
-rw-r--r--indra/newview/skins/default/xui/da/floater_about_land.xml42
-rw-r--r--indra/newview/skins/default/xui/da/floater_animation_preview.xml48
-rw-r--r--indra/newview/skins/default/xui/da/floater_build_options.xml4
-rw-r--r--indra/newview/skins/default/xui/da/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_buy_land.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_camera.xml14
-rw-r--r--indra/newview/skins/default/xui/da/floater_customize.xml6
-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.xml24
-rw-r--r--indra/newview/skins/default/xui/da/floater_god_tools.xml9
-rw-r--r--indra/newview/skins/default/xui/da/floater_im.xml4
-rw-r--r--indra/newview/skins/default/xui/da/floater_image_preview.xml20
-rw-r--r--indra/newview/skins/default/xui/da/floater_moveview.xml10
-rw-r--r--indra/newview/skins/default/xui/da/floater_outgoing_call.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_publish_classified.xml15
-rw-r--r--indra/newview/skins/default/xui/da/floater_snapshot.xml89
-rw-r--r--indra/newview/skins/default/xui/da/floater_tools.xml57
-rw-r--r--indra/newview/skins/default/xui/da/floater_tos.xml16
-rw-r--r--indra/newview/skins/default/xui/da/floater_water.xml4
-rw-r--r--indra/newview/skins/default/xui/da/floater_windlight_options.xml148
-rw-r--r--indra/newview/skins/default/xui/da/floater_world_map.xml42
-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.xml1
-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.xml1
-rw-r--r--indra/newview/skins/default/xui/da/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml2
-rw-r--r--indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml1
-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.xml1
-rw-r--r--indra/newview/skins/default/xui/da/menu_login.xml15
-rw-r--r--indra/newview/skins/default/xui/da/menu_mini_map.xml4
-rw-r--r--indra/newview/skins/default/xui/da/menu_object.xml1
-rw-r--r--indra/newview/skins/default/xui/da/menu_participant_list.xml1
-rw-r--r--indra/newview/skins/default/xui/da/menu_profile_overflow.xml1
-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.xml31
-rw-r--r--indra/newview/skins/default/xui/da/notifications.xml90
-rw-r--r--indra/newview/skins/default/xui/da/outfit_accordion_tab.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_classified_info.xml36
-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_shape.xml24
-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_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.xml5
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_general.xml5
-rw-r--r--indra/newview/skins/default/xui/da/panel_im_control_panel.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_landmarks.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_login.xml16
-rw-r--r--indra/newview/skins/default/xui/da/panel_main_inventory.xml30
-rw-r--r--indra/newview/skins/default/xui/da/panel_media_settings_permissions.xml9
-rw-r--r--indra/newview/skins/default/xui/da/panel_navigation_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_nearby_media.xml15
-rw-r--r--indra/newview/skins/default/xui/da/panel_outfit_edit.xml48
-rw-r--r--indra/newview/skins/default/xui/da/panel_outfits_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_people.xml19
-rw-r--r--indra/newview/skins/default/xui/da/panel_place_profile.xml61
-rw-r--r--indra/newview/skins/default/xui/da/panel_places.xml1
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_advanced.xml9
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_chat.xml12
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_general.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_setup.xml5
-rw-r--r--indra/newview/skins/default/xui/da/panel_region_covenant.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_region_estate.xml2
-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.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_region_texture.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_side_tray.xml14
-rw-r--r--indra/newview/skins/default/xui/da/panel_teleport_history.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/da/sidepanel_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/da/sidepanel_item_info.xml16
-rw-r--r--indra/newview/skins/default/xui/da/sidepanel_task_info.xml53
-rw-r--r--indra/newview/skins/default/xui/da/strings.xml273
-rw-r--r--indra/newview/skins/default/xui/da/teleport_strings.xml3
-rw-r--r--indra/newview/skins/default/xui/de/floater_about.xml7
-rw-r--r--indra/newview/skins/default/xui/de/floater_about_land.xml41
-rw-r--r--indra/newview/skins/default/xui/de/floater_animation_preview.xml48
-rw-r--r--indra/newview/skins/default/xui/de/floater_build_options.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_currency.xml9
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_land.xml10
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_object.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_color_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_customize.xml24
-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_gesture.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_god_tools.xml15
-rw-r--r--indra/newview/skins/default/xui/de/floater_hardware_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_image_preview.xml20
-rw-r--r--indra/newview/skins/default/xui/de/floater_outgoing_call.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_snapshot.xml89
-rw-r--r--indra/newview/skins/default/xui/de/floater_sys_well.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_tools.xml17
-rw-r--r--indra/newview/skins/default/xui/de/floater_tos.xml23
-rw-r--r--indra/newview/skins/default/xui/de/floater_world_map.xml2
-rw-r--r--indra/newview/skins/default/xui/de/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/de/menu_attachment_other.xml2
-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.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_avatar_self.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/de/menu_inspect_avatar_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.xml3
-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_participant_list.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_profile_overflow.xml1
-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.xml18
-rw-r--r--indra/newview/skins/default/xui/de/mime_types.xml8
-rw-r--r--indra/newview/skins/default/xui/de/notifications.xml146
-rw-r--r--indra/newview/skins/default/xui/de/outfit_accordion_tab.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_classified_info.xml2
-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.xml8
-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.xml5
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_shape.xml24
-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_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.xml5
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_general.xml5
-rw-r--r--indra/newview/skins/default/xui/de/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_main_inventory.xml30
-rw-r--r--indra/newview/skins/default/xui/de/panel_media_settings_permissions.xml9
-rw-r--r--indra/newview/skins/default/xui/de/panel_nearby_media.xml11
-rw-r--r--indra/newview/skins/default/xui/de/panel_outfit_edit.xml48
-rw-r--r--indra/newview/skins/default/xui/de/panel_outfits_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_people.xml21
-rw-r--r--indra/newview/skins/default/xui/de/panel_place_profile.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_places.xml1
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_advanced.xml9
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_alerts.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_chat.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_setup.xml5
-rw-r--r--indra/newview/skins/default/xui/de/panel_profile.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_covenant.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_estate.xml16
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_general.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_terrain.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_status_bar.xml2
-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.xml1
-rw-r--r--indra/newview/skins/default/xui/de/strings.xml265
-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.xml57
-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.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_object.xml7
-rw-r--r--indra/newview/skins/default/xui/en/floater_camera.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_color_picker.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_customize.xml662
-rw-r--r--indra/newview/skins/default/xui/en/floater_day_cycle_options.xml63
-rw-r--r--indra/newview/skins/default/xui/en/floater_event.xml1
-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_im_container.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_session.xml10
-rw-r--r--indra/newview/skins/default/xui/en/floater_image_preview.xml30
-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_map.xml9
-rw-r--r--indra/newview/skins/default/xui/en/floater_moveview.xml145
-rw-r--r--indra/newview/skins/default/xui/en/floater_outfit_save_as.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_outgoing_call.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_perm_prefs.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences.xml10
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_gesture.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_notecard.xml17
-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_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_sell_land.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_snapshot.xml484
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_text_editor.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_widgets.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml284
-rw-r--r--indra/newview/skins/default/xui/en/floater_tos.xml9
-rw-r--r--indra/newview/skins/default/xui/en/floater_ui_preview.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_controls.xml2
-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.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/en/inspect_group.xml6
-rw-r--r--indra/newview/skins/default/xui/en/inspect_object.xml51
-rw-r--r--indra/newview/skins/default/xui/en/inspector_info_ctrl.xml6
-rw-r--r--indra/newview/skins/default/xui/en/main_view.xml46
-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.xml13
-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.xml55
-rw-r--r--indra/newview/skins/default/xui/en/menu_cof_attachment.xml21
-rw-r--r--indra/newview/skins/default/xui/en/menu_cof_body_part.xml22
-rw-r--r--indra/newview/skins/default/xui/en/menu_cof_clothing.xml42
-rw-r--r--indra/newview/skins/default/xui/en/menu_cof_gear.xml16
-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_inspect_avatar_gear.xml4
-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.xml16
-rw-r--r--indra/newview/skins/default/xui/en/menu_login.xml139
-rw-r--r--indra/newview/skins/default/xui/en/menu_object.xml25
-rw-r--r--indra/newview/skins/default/xui/en/menu_outfit_gear.xml50
-rw-r--r--indra/newview/skins/default/xui/en/menu_outfit_tab.xml41
-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.xml3
-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_profile_overflow.xml9
-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_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.xml720
-rw-r--r--indra/newview/skins/default/xui/en/menu_wearable_list_item.xml58
-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.xml400
-rw-r--r--indra/newview/skins/default/xui/en/outfit_accordion_tab.xml22
-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.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml81
-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.xml519
-rw-r--r--indra/newview/skins/default/xui/en/panel_chat_header.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml1
-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.xml112
-rw-r--r--indra/newview/skins/default/xui/en/panel_cof_wearables.xml110
-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.xml72
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_alpha.xml68
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_eyes.xml62
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_gloves.xml63
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_hair.xml62
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_jacket.xml70
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pants.xml61
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pick.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_profile.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_shape.xml125
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_shirt.xml57
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_shoes.xml61
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_skin.xml74
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_skirt.xml61
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_socks.xml61
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_tattoo.xml49
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_underpants.xml61
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_undershirt.xml61
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_wearable.xml178
-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.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_land_money.xml7
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notices.xml23
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_roles.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_im_control_panel.xml44
-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.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmarks.xml86
-rw-r--r--indra/newview/skins/default/xui/en/panel_login.xml34
-rw-r--r--indra/newview/skins/default/xui/en/panel_main_inventory.xml643
-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.xml14
-rw-r--r--indra/newview/skins/default/xui/en/panel_navigation_bar.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_media.xml59
-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_toast.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfit_edit.xml481
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_inventory.xml105
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_list.xml25
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml326
-rw-r--r--indra/newview/skins/default/xui/en/panel_pick_list_item.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_place_profile.xml17
-rw-r--r--indra/newview/skins/default/xui/en/panel_places.xml13
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_advanced.xml64
-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.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_general.xml23
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml132
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_privacy.xml11
-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.xml16
-rw-r--r--indra/newview/skins/default/xui/en/panel_prim_media_controls.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml49
-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.xml40
-rw-r--r--indra/newview/skins/default/xui/en/panel_script_ed.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_scrolling_param.xml62
-rw-r--r--indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_status_bar.xml51
-rw-r--r--indra/newview/skins/default/xui/en/panel_teleport_history.xml65
-rw-r--r--indra/newview/skins/default/xui/en/panel_toast.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_volume_pulldown.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_world_map.xml8
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_appearance.xml112
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_inventory.xml34
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_item_info.xml2
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_task_info.xml2
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml187
-rw-r--r--indra/newview/skins/default/xui/en/widgets/expandable_text.xml3
-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.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/text.xml1
-rw-r--r--indra/newview/skins/default/xui/es/floater_about.xml13
-rw-r--r--indra/newview/skins/default/xui/es/floater_about_land.xml81
-rw-r--r--indra/newview/skins/default/xui/es/floater_animation_preview.xml71
-rw-r--r--indra/newview/skins/default/xui/es/floater_avatar_textures.xml71
-rw-r--r--indra/newview/skins/default/xui/es/floater_build_options.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_currency.xml2
-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.xml38
-rw-r--r--indra/newview/skins/default/xui/es/floater_camera.xml12
-rw-r--r--indra/newview/skins/default/xui/es/floater_customize.xml40
-rw-r--r--indra/newview/skins/default/xui/es/floater_day_cycle_options.xml12
-rw-r--r--indra/newview/skins/default/xui/es/floater_event.xml24
-rw-r--r--indra/newview/skins/default/xui/es/floater_gesture.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_god_tools.xml9
-rw-r--r--indra/newview/skins/default/xui/es/floater_im.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_image_preview.xml20
-rw-r--r--indra/newview/skins/default/xui/es/floater_incoming_call.xml2
-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.xml10
-rw-r--r--indra/newview/skins/default/xui/es/floater_land_holdings.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_map.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_moveview.xml46
-rw-r--r--indra/newview/skins/default/xui/es/floater_outgoing_call.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_notecard.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_publish_classified.xml15
-rw-r--r--indra/newview/skins/default/xui/es/floater_snapshot.xml89
-rw-r--r--indra/newview/skins/default/xui/es/floater_tools.xml63
-rw-r--r--indra/newview/skins/default/xui/es/floater_tos.xml16
-rw-r--r--indra/newview/skins/default/xui/es/floater_water.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_windlight_options.xml21
-rw-r--r--indra/newview/skins/default/xui/es/floater_world_map.xml44
-rw-r--r--indra/newview/skins/default/xui/es/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_attachment_other.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_attachment_self.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_avatar_other.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_avatar_self.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_bottomtray.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml5
-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.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_land.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_login.xml17
-rw-r--r--indra/newview/skins/default/xui/es/menu_mini_map.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_object.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_participant_list.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_nearby.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_profile_overflow.xml1
-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_viewer.xml37
-rw-r--r--indra/newview/skins/default/xui/es/notifications.xml815
-rw-r--r--indra/newview/skins/default/xui/es/outfit_accordion_tab.xml4
-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.xml23
-rw-r--r--indra/newview/skins/default/xui/es/panel_classified_info.xml44
-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_classified.xml21
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_eyes.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_gloves.xml8
-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.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_pants.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_pick.xml7
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_shape.xml34
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_shirt.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_shoes.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_skin.xml14
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_skirt.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_socks.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_tattoo.xml1
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_underpants.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_undershirt.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_wearable.xml11
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_general.xml5
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_land_money.xml3
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_notices.xml1
-rw-r--r--indra/newview/skins/default/xui/es/panel_im_control_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_login.xml16
-rw-r--r--indra/newview/skins/default/xui/es/panel_main_inventory.xml76
-rw-r--r--indra/newview/skins/default/xui/es/panel_media_settings_permissions.xml9
-rw-r--r--indra/newview/skins/default/xui/es/panel_nearby_media.xml13
-rw-r--r--indra/newview/skins/default/xui/es/panel_notes.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_outfit_edit.xml45
-rw-r--r--indra/newview/skins/default/xui/es/panel_outfits_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_people.xml29
-rw-r--r--indra/newview/skins/default/xui/es/panel_place_profile.xml7
-rw-r--r--indra/newview/skins/default/xui/es/panel_places.xml1
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_advanced.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_alerts.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_chat.xml13
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_general.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml13
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_privacy.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_setup.xml9
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_estate.xml2
-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.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_texture.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_side_tray.xml14
-rw-r--r--indra/newview/skins/default/xui/es/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/es/sidepanel_appearance.xml8
-rw-r--r--indra/newview/skins/default/xui/es/sidepanel_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/es/sidepanel_task_info.xml51
-rw-r--r--indra/newview/skins/default/xui/es/strings.xml437
-rw-r--r--indra/newview/skins/default/xui/es/teleport_strings.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about_land.xml22
-rw-r--r--indra/newview/skins/default/xui/fr/floater_animation_preview.xml48
-rw-r--r--indra/newview/skins/default/xui/fr/floater_avatar_textures.xml74
-rw-r--r--indra/newview/skins/default/xui/fr/floater_bulk_perms.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_buy_currency.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_buy_currency_html.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_color_picker.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_customize.xml106
-rw-r--r--indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml49
-rw-r--r--indra/newview/skins/default/xui/fr/floater_gesture.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_god_tools.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/floater_image_preview.xml20
-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.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/floater_map.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_moveview.xml36
-rw-r--r--indra/newview/skins/default/xui/fr/floater_outgoing_call.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_perm_prefs.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_postcard.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_notecard.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_snapshot.xml89
-rw-r--r--indra/newview/skins/default/xui/fr/floater_sys_well.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_tools.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/floater_tos.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/floater_water.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_windlight_options.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_world_map.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.xml2
-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.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_avatar_self.xml9
-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.xml2
-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.xml4
-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_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_participant_list.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_profile_overflow.xml1
-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.xml30
-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.xml163
-rw-r--r--indra/newview/skins/default/xui/fr/outfit_accordion_tab.xml4
-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.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/panel_classified_info.xml6
-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_classified.xml2
-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.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_profile.xml2
-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_group_general.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_land_money.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_notices.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_login.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/panel_main_inventory.xml76
-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_nearby_media.xml19
-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.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_people.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/panel_place_profile.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/panel_places.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_chat.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml22
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_setup.xml5
-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.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_covenant.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_texture.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/panel_status_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_world_map.xml6
-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.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml443
-rw-r--r--indra/newview/skins/default/xui/it/floater_about.xml23
-rw-r--r--indra/newview/skins/default/xui/it/floater_about_land.xml135
-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.xml57
-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_land.xml274
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_object.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_camera.xml28
-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.xml14
-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.xml40
-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.xml8
-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.xml90
-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.xml27
-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.xml77
-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.xml16
-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.xml17
-rw-r--r--indra/newview/skins/default/xui/it/menu_bottomtray.xml8
-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.xml2
-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.xml63
-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.xml29
-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_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.xml421
-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.xml717
-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_bottomtray.xml25
-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_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.xml28
-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.xml6
-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.xml43
-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.xml124
-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.xml20
-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.xml21
-rw-r--r--indra/newview/skins/default/xui/it/panel_main_inventory.xml90
-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.xml10
-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.xml48
-rw-r--r--indra/newview/skins/default/xui/it/panel_outfits_inventory.xml17
-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.xml43
-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.xml80
-rw-r--r--indra/newview/skins/default/xui/it/panel_places.xml16
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_advanced.xml62
-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.xml26
-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.xml16
-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.xml10
-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_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.xml11
-rw-r--r--indra/newview/skins/default/xui/it/sidepanel_inventory.xml1
-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.xml124
-rw-r--r--indra/newview/skins/default/xui/it/strings.xml1209
-rw-r--r--indra/newview/skins/default/xui/it/teleport_strings.xml13
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about_land.xml38
-rw-r--r--indra/newview/skins/default/xui/ja/floater_animation_preview.xml48
-rw-r--r--indra/newview/skins/default/xui/ja/floater_avatar_textures.xml76
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_currency_html.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml35
-rw-r--r--indra/newview/skins/default/xui/ja/floater_gesture.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_god_tools.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/floater_image_preview.xml20
-rw-r--r--indra/newview/skins/default/xui/ja/floater_joystick.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_map.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_moveview.xml36
-rw-r--r--indra/newview/skins/default/xui/ja/floater_outgoing_call.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_postcard.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_notecard.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_report_abuse.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_snapshot.xml89
-rw-r--r--indra/newview/skins/default/xui/ja/floater_sys_well.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_tools.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/floater_tos.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/floater_world_map.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/inspect_avatar.xml4
-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.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_bottomtray.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml2
-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.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_login.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/menu_mini_map.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_participant_list.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_profile_overflow.xml1
-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_viewer.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/notifications.xml162
-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.xml23
-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_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_shape.xml34
-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.xml1
-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.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_general.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_land_money.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_notices.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_roles.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_login.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_main_inventory.xml76
-rw-r--r--indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/panel_nearby_media.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfit_edit.xml45
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_people.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/panel_place_profile.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_places.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_chat.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_general.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_setup.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_sound.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_estate.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_status_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_appearance.xml13
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/strings.xml423
-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--indra/newview/skins/default/xui/pl/floater_about.xml26
-rw-r--r--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--indra/newview/skins/default/xui/pl/floater_animation_preview.xml309
-rw-r--r--indra/newview/skins/default/xui/pl/floater_auction.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/floater_avatar_picker.xml48
-rw-r--r--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--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--indra/newview/skins/default/xui/pl/floater_bumps.xml29
-rw-r--r--indra/newview/skins/default/xui/pl/floater_buy_contents.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/floater_buy_currency.xml81
-rw-r--r--indra/newview/skins/default/xui/pl/floater_buy_land.xml268
-rw-r--r--indra/newview/skins/default/xui/pl/floater_buy_object.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/floater_camera.xml26
-rw-r--r--indra/newview/skins/default/xui/pl/floater_choose_group.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/floater_color_picker.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/floater_customize.xml223
-rw-r--r--indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/floater_device_settings.xml5
-rw-r--r--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--indra/newview/skins/default/xui/pl/floater_gesture.xml37
-rw-r--r--indra/newview/skins/default/xui/pl/floater_god_tools.xml81
-rw-r--r--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--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.xml2
-rw-r--r--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--indra/newview/skins/default/xui/pl/floater_inspect.xml19
-rw-r--r--indra/newview/skins/default/xui/pl/floater_inventory.xml57
-rw-r--r--indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml90
-rw-r--r--indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_joystick.xml188
-rw-r--r--indra/newview/skins/default/xui/pl/floater_lagmeter.xml239
-rw-r--r--indra/newview/skins/default/xui/pl/floater_land_holdings.xml12
-rw-r--r--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--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--indra/newview/skins/default/xui/pl/floater_mem_leaking.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/floater_moveview.xml54
-rw-r--r--indra/newview/skins/default/xui/pl/floater_mute_object.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_nearby_chat.xml2
-rw-r--r--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--indra/newview/skins/default/xui/pl/floater_pay.xml30
-rw-r--r--indra/newview/skins/default/xui/pl/floater_pay_object.xml45
-rw-r--r--indra/newview/skins/default/xui/pl/floater_perm_prefs.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_post_process.xml16
-rw-r--r--indra/newview/skins/default/xui/pl/floater_postcard.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/floater_preferences.xml19
-rw-r--r--indra/newview/skins/default/xui/pl/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/floater_preview_event.xml8
-rw-r--r--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--indra/newview/skins/default/xui/pl/floater_preview_notecard.xml22
-rw-r--r--indra/newview/skins/default/xui/pl/floater_preview_sound.xml13
-rw-r--r--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--indra/newview/skins/default/xui/pl/floater_region_info.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/floater_report_abuse.xml60
-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--indra/newview/skins/default/xui/pl/floater_script_preview.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/floater_script_queue.xml19
-rw-r--r--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--indra/newview/skins/default/xui/pl/floater_select_key.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_sell_land.xml125
-rw-r--r--indra/newview/skins/default/xui/pl/floater_settings_debug.xml12
-rw-r--r--indra/newview/skins/default/xui/pl/floater_snapshot.xml70
-rw-r--r--indra/newview/skins/default/xui/pl/floater_sound_preview.xml2
-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--indra/newview/skins/default/xui/pl/floater_telehub.xml25
-rw-r--r--indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/floater_tools.xml590
-rw-r--r--indra/newview/skins/default/xui/pl/floater_top_objects.xml79
-rw-r--r--indra/newview/skins/default/xui/pl/floater_tos.xml11
-rw-r--r--indra/newview/skins/default/xui/pl/floater_voice_controls.xml26
-rw-r--r--indra/newview/skins/default/xui/pl/floater_water.xml90
-rw-r--r--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--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--indra/newview/skins/default/xui/pl/floater_world_map.xml123
-rw-r--r--indra/newview/skins/default/xui/pl/inspect_avatar.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/inspect_group.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/inspect_object.xml34
-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--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--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--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--indra/newview/skins/default/xui/pl/menu_viewer.xml83
-rw-r--r--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.xml6
-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--indra/newview/skins/default/xui/pl/panel_audio_device.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_avatar_list_item.xml1
-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_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.xml6
-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--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--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--indra/newview/skins/default/xui/pl/panel_group_invite.xml32
-rw-r--r--indra/newview/skins/default/xui/pl/panel_group_land_money.xml129
-rw-r--r--indra/newview/skins/default/xui/pl/panel_group_list_item.xml1
-rw-r--r--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--indra/newview/skins/default/xui/pl/panel_group_roles.xml4
-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.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/panel_landmarks.xml14
-rw-r--r--indra/newview/skins/default/xui/pl/panel_login.xml2
-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.xml6
-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.xml17
-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.xml30
-rw-r--r--indra/newview/skins/default/xui/pl/panel_pick_info.xml16
-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--indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_chat.xml22
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_general.xml120
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml213
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_setup.xml63
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_sound.xml17
-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.xml64
-rw-r--r--indra/newview/skins/default/xui/pl/panel_profile_view.xml16
-rw-r--r--indra/newview/skins/default/xui/pl/panel_region_covenant.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/panel_region_debug.xml20
-rw-r--r--indra/newview/skins/default/xui/pl/panel_region_estate.xml21
-rw-r--r--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--indra/newview/skins/default/xui/pl/panel_region_terrain.xml12
-rw-r--r--indra/newview/skins/default/xui/pl/panel_region_texture.xml32
-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--indra/newview/skins/default/xui/pl/panel_side_tray.xml15
-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.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_status_bar.xml60
-rw-r--r--indra/newview/skins/default/xui/pl/panel_teleport_history.xml4
-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--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.xml55
-rw-r--r--indra/newview/skins/default/xui/pl/sidepanel_task_info.xml129
-rw-r--r--indra/newview/skins/default/xui/pl/strings.xml1126
-rw-r--r--indra/newview/skins/default/xui/pl/teleport_strings.xml3
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about_land.xml174
-rw-r--r--indra/newview/skins/default/xui/pt/floater_animation_preview.xml48
-rw-r--r--indra/newview/skins/default/xui/pt/floater_bulk_perms.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_land.xml3
-rw-r--r--indra/newview/skins/default/xui/pt/floater_camera.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/floater_customize.xml44
-rw-r--r--indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/floater_event.xml24
-rw-r--r--indra/newview/skins/default/xui/pt/floater_god_tools.xml21
-rw-r--r--indra/newview/skins/default/xui/pt/floater_im.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_image_preview.xml20
-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.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/floater_moveview.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/floater_outgoing_call.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_postcard.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preferences.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_publish_classified.xml15
-rw-r--r--indra/newview/skins/default/xui/pt/floater_snapshot.xml89
-rw-r--r--indra/newview/skins/default/xui/pt/floater_tools.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/floater_tos.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/floater_voice_controls.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_water.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_windlight_options.xml24
-rw-r--r--indra/newview/skins/default/xui/pt/floater_world_map.xml39
-rw-r--r--indra/newview/skins/default/xui/pt/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_attachment_other.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_attachment_self.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/menu_avatar_other.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_avatar_self.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml1
-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.xml50
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inventory_add.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_login.xml15
-rw-r--r--indra/newview/skins/default/xui/pt/menu_mini_map.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_object.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/menu_participant_list.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/menu_profile_overflow.xml1
-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_teleport_history_item.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_viewer.xml73
-rw-r--r--indra/newview/skins/default/xui/pt/notifications.xml206
-rw-r--r--indra/newview/skins/default/xui/pt/outfit_accordion_tab.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_classified_info.xml40
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_classified.xml19
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_eyes.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_gloves.xml8
-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.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_pants.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_pick.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_shape.xml24
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_shirt.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_shoes.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_skin.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_skirt.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_socks.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_tattoo.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_underpants.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_wearable.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_general.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_notices.xml6
-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.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_login.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/panel_main_inventory.xml32
-rw-r--r--indra/newview/skins/default/xui/pt/panel_media_settings_general.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_media_settings_permissions.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_navigation_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_nearby_media.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_outfit_edit.xml48
-rw-r--r--indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_people.xml31
-rw-r--r--indra/newview/skins/default/xui/pt/panel_place_profile.xml15
-rw-r--r--indra/newview/skins/default/xui/pt/panel_places.xml3
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml19
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_chat.xml18
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_general.xml20
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_setup.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_debug.xml22
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_estate.xml2
-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.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_texture.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/panel_side_tray.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/sidepanel_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/sidepanel_task_info.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/strings.xml603
-rw-r--r--indra/newview/skins/default/xui/pt/teleport_strings.xml5
-rw-r--r--indra/newview/tests/lllogininstance_test.cpp122
-rw-r--r--indra/newview/tests/llsecapi_test.cpp188
-rw-r--r--indra/newview/tests/llsechandler_basic_test.cpp1051
-rw-r--r--indra/newview/tests/llslurl_test.cpp258
-rw-r--r--indra/newview/tests/llviewernetwork_test.cpp456
-rwxr-xr-xindra/newview/viewer_manifest.py24
-rw-r--r--indra/test_apps/llplugintest/bookmarks.txt24
-rw-r--r--indra/test_apps/llplugintest/llmediaplugintest.cpp23
-rw-r--r--indra/test_apps/llplugintest/llmediaplugintest.h2
-rw-r--r--indra/viewer_components/login/lllogin.cpp43
-rw-r--r--indra/win_updater/CMakeLists.txt13
-rw-r--r--install.xml78
1993 files changed, 81198 insertions, 45047 deletions
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 2e4d803252..3f33763ce0 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -17,11 +17,14 @@ 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-6348
VWR-6358
VWR-6360
@@ -42,9 +45,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
@@ -599,6 +608,7 @@ tenebrous pau
Tharax Ferraris
VWR-605
Thickbrick Sleaford
+ SNOW-207
VWR-7109
VWR-9287
VWR-13483
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/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/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/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/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..f814618fc1 100644
--- a/indra/llcharacter/llkeyframewalkmotion.cpp
+++ b/indra/llcharacter/llkeyframewalkmotion.cpp
@@ -48,8 +48,10 @@ const F32 MAX_WALK_PLAYBACK_SPEED = 8.f; // max m/s for which we adjust walk cyc
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
+F32 SPEED_ADJUST_MAX = 2.5f; // maximum adjustment of walk animation playback speed
+F32 SPEED_ADJUST_MAX_SEC = 3.f; // maximum adjustment to walk animation playback speed for a second
+F32 ANIM_SPEED_MAX = 10.0f; // absolute upper limit on animation speed
+F32 ANIM_SPEED_MIN = 0.0f; // absolute lower limit on animation speed
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_ROLL = 0.6f;
@@ -300,6 +302,7 @@ BOOL LLWalkAdjustMotion::onUpdate(F32 time, U8* joint_mask)
// and if we're moving backward, we walk backward
F32 directional_factor = localVel.mV[VX] * mRelativeDir;
+
if (speed > 0.1f)
{
// calculate ratio of desired foot velocity to detected foot velocity
@@ -318,16 +321,36 @@ BOOL LLWalkAdjustMotion::onUpdate(F32 time, U8* joint_mask)
}
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);
+ if (mAnimSpeed>0)
+ {
+ mAnimSpeed = llclamp(mAnimSpeed, ANIM_SPEED_MIN, ANIM_SPEED_MAX);
+ }
+ else
+ {
+ mAnimSpeed = llclamp(mAnimSpeed, -ANIM_SPEED_MAX, -ANIM_SPEED_MIN);
+ }
+// 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);
+ if (mCharacter->getMotionController().mIsSelf)
+ {
+// F32 elapsed = mCharacter->getMotionController().getFrameTimer().getElapsedTimeF32();
+// llinfos << "PLOT elapsed: " << elapsed
+// << " footSlipVelocity: " << footSlipVelocity
+// << " mAvgCorrection: " << mAvgCorrection
+// << " mAvgSpeed: " << mAvgSpeed
+// << " mAnimSpeed: " << mAnimSpeed
+// << " ANIM_SPEED_MAX: " << ANIM_SPEED_MAX
+// << " ANIM_SPEED_MIN: " << ANIM_SPEED_MIN
+// << llendl;
+ }
// 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;
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/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 4481d334b2..3c689930b8 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -35,6 +35,7 @@ set(llcommon_SOURCE_FILES
llbase32.cpp
llbase64.cpp
llcommon.cpp
+ llcommonutils.cpp
llcoros.cpp
llcrc.cpp
llcriticaldamp.cpp
@@ -124,6 +125,7 @@ set(llcommon_HEADER_FILES
llchat.h
llclickaction.h
llcommon.h
+ llcommonutils.h
llcoros.h
llcrc.h
llcriticaldamp.h
diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h
index 27a52cdd99..e5b8edf9c3 100644
--- a/indra/llcommon/llapp.h
+++ b/indra/llcommon/llapp.h
@@ -235,7 +235,7 @@ public:
// 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);
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 f1b9091298..63cce24005 100644
--- a/indra/llcommon/llchat.h
+++ b/indra/llcommon/llchat.h
@@ -82,6 +82,7 @@ public:
mFromName(),
mFromID(),
mNotifId(),
+ mOwnerID(),
mSourceType(CHAT_SOURCE_AGENT),
mChatType(CHAT_TYPE_NORMAL),
mAudible(CHAT_AUDIBLE_FULLY),
@@ -98,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/llerror.cpp b/indra/llcommon/llerror.cpp
index bd334a6654..41ff5849f4 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -1225,17 +1225,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 +1286,7 @@ namespace LLError
apr_thread_mutex_unlock(gCallStacksLogMutexp);
}
}
+#endif
//static
void LLCallStacks::push(const char* function, const int line)
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 2e5edb1f3b..f39a4e6619 100644
--- a/indra/llcommon/llfasttimer_class.cpp
+++ b/indra/llcommon/llfasttimer_class.cpp
@@ -230,17 +230,17 @@ 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));
- // 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
diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp
index 8a4a4a8f9a..f6ab55a6b5 100644
--- a/indra/llcommon/llprocessor.cpp
+++ b/indra/llcommon/llprocessor.cpp
@@ -60,6 +60,10 @@
# include <windows.h>
#endif
+#if LL_LINUX
+#include "llsys.h"
+#endif // LL_LINUX
+
#if !LL_DARWIN && !LL_SOLARIS
#ifdef PROCESSOR_FREQUENCY_MEASURE_AVAILABLE
@@ -116,6 +120,11 @@ CProcessor::CProcessor()
////////////////////////////////////////////////////////////////////////////
F64 CProcessor::GetCPUFrequency(unsigned int uiMeasureMSecs)
{
+#if LL_LINUX
+ // use the shinier LLCPUInfo interface
+ return 1000000.0F * gSysCPU.getMHz();
+#endif
+
#ifndef PROCESSOR_FREQUENCY_MEASURE_AVAILABLE
return 0;
#else
@@ -781,7 +790,7 @@ bool CProcessor::AnalyzeAMDProcessor()
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)
+ 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;
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/llstring.cpp b/indra/llcommon/llstring.cpp
index 5f3d9d6582..b5a73ec1d1 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -911,6 +911,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)
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 62cedcde4e..96588b29b9 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -241,8 +241,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)
{
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 0272c55db2..52b1b63209 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -519,15 +519,15 @@ LLCPUInfo::LLCPUInfo()
mHasSSE = info->_Ext.SSE_StreamingSIMD_Extensions;
mHasSSE2 = info->_Ext.SSE2_StreamingSIMD2_Extensions;
mHasAltivec = info->_Ext.Altivec_Extensions;
- mCPUMhz = (S32)(proc.GetCPUFrequency(50)/1000000.0);
+ mCPUMHz = (F64)(proc.GetCPUFrequency(50)/1000000.0F);
mFamily.assign( info->strFamily );
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
+ 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();
@@ -572,7 +572,7 @@ LLCPUInfo::LLCPUInfo()
if (LLStringUtil::convertToF64(cpuinfo["cpu mhz"], mhz)
&& 200.0 < mhz && mhz < 10000.0)
{
- mCPUMhz = (S32)llrint(mhz);
+ mCPUMHz = (F64)(mhz);
}
if (!cpuinfo["model name"].empty())
mCPUString = cpuinfo["model name"];
@@ -595,9 +595,9 @@ bool LLCPUInfo::hasSSE2() const
return mHasSSE2;
}
-S32 LLCPUInfo::getMhz() const
+F64 LLCPUInfo::getMHz() const
{
- return mCPUMhz;
+ return mCPUMHz;
}
std::string LLCPUInfo::getCPUString() const
@@ -644,7 +644,7 @@ void LLCPUInfo::stream(std::ostream& s) const
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 f1dda1b2e2..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;
};
@@ -122,6 +122,7 @@ public:
U32 getPhysicalMemoryClamped() const; ///< Memory size in clamped bytes
};
+
LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLOSInfo& info);
LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLCPUInfo& info);
LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLMemoryInfo& info);
diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp
index 25b768079b..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()
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..e3663544db 100644
--- a/indra/llcommon/llversionserver.h
+++ b/indra/llcommon/llversionserver.h
@@ -36,7 +36,7 @@
const S32 LL_VERSION_MAJOR = 1;
const S32 LL_VERSION_MINOR = 31;
const S32 LL_VERSION_PATCH = 0;
-const S32 LL_VERSION_BUILD = 200030;
+const S32 LL_VERSION_BUILD = 203110;
const char * const LL_CHANNEL = "Second Life Server";
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index 540aea4252..fc3ce6df7e 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -35,8 +35,8 @@
const S32 LL_VERSION_MAJOR = 2;
const S32 LL_VERSION_MINOR = 0;
-const S32 LL_VERSION_PATCH = 0;
-const S32 LL_VERSION_BUILD = 200030;
+const S32 LL_VERSION_PATCH = 2;
+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 411977474b..a29e9a348e 100644
--- a/indra/llcommon/llworkerthread.cpp
+++ b/indra/llcommon/llworkerthread.cpp
@@ -347,12 +347,12 @@ bool LLWorkerClass::checkWork(bool aborting)
{
mRequestHandle = LLWorkerThread::nullHandle();
clearFlags(WCF_HAVE_WORK);
- return true ;
}
else
{
llassert_always(workreq);
}
+ return true ;
}
LLQueuedThread::status_t status = workreq->getStatus();
@@ -404,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/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 7d0de18c7c..aa7c8c789a 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,23 +156,32 @@ U8* LLImageBase::allocateData(S32 size)
llerrs << llformat("LLImageBase::allocateData called with bad dimensions: %dx%dx%d",mWidth,mHeight,mComponents) << llendl;
}
}
- if (size < 1 || (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)
{
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;
}
@@ -222,7 +230,7 @@ U8* LLImageBase::getData()
return mData;
}
-BOOL LLImageBase::isBufferInvalid()
+bool LLImageBase::isBufferInvalid()
{
return mBadBufferAllocation || mData == NULL ;
}
@@ -258,7 +266,11 @@ 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 );
+ if(S32(width) * S32(height) * S32(components) > MAX_IMAGE_DATA_SIZE)
+ {
+ llwarns << "over size: width: " << (S32)width << " height: " << (S32)height << " components: " << (S32)components << llendl ;
+ }
allocateDataSize(width, height, components);
++sRawImageCount;
}
@@ -1326,7 +1338,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/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..2c767a4857 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,25 +63,23 @@ 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),
@@ -99,7 +96,7 @@ LLInventoryObject::LLInventoryObject() :
{
}
-LLInventoryObject::~LLInventoryObject( void )
+LLInventoryObject::~LLInventoryObject()
{
}
@@ -292,18 +289,17 @@ void LLInventoryObject::updateServer(BOOL) const
/// 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 +454,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 +476,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 +1307,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..b083e305b1 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,94 @@
#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);
+ //--------------------------------------------------------------------
+ // 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
+ //--------------------------------------------------------------------
+ // Initialization
+ //--------------------------------------------------------------------
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
-
-public:
-
MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY);
LLInventoryItem(const LLUUID& uuid,
const LLUUID& parent_uuid,
@@ -237,10 +149,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 +168,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 +181,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 +251,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/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/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..91e11b8c0d 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());
@@ -481,8 +465,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 +895,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 +1053,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..9c2e4b5658 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)
@@ -206,13 +211,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 +233,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 +428,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/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 6a2449cf4b..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.
@@ -678,6 +692,34 @@ 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
@@ -961,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;
@@ -1044,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 58e91fa0b4..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();
@@ -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 1d7ddc5592..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,26 +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
if (mOwner)
{
- mOwner->receiveMessageRaw(mInput.substr(start, delim - start));
+ // 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;
}
-
- start = delim + 1;
}
-
- // 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 52b5a319ec..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);
@@ -310,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)
{
@@ -328,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")
{
@@ -427,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;
@@ -438,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")
{
@@ -496,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;
+ }
+ }
}
@@ -504,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/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index 768f042e69..d9e1976341 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -673,7 +673,7 @@ 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;
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..ff47c57c70 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,8 +1738,18 @@ 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;
+ llassert(false);
+ }
if (LL_UNLIKELY(u < 0.f || u > 1.f ||
v < 0.f || v > 1.f))
@@ -1743,20 +1759,18 @@ BOOL LLImageGL::getMask(const LLVector2 &tc)
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 656f690db5..c3540a717c 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -121,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)
{
@@ -150,6 +152,7 @@ void LLTexUnit::activate(void)
if ((S32)gGL.mCurrTextureUnitIndex != mIndex || gGL.mDirty)
{
+ gGL.flush();
glActiveTextureARB(GL_TEXTURE0_ARB + mIndex);
gGL.mCurrTextureUnitIndex = mIndex;
}
@@ -181,6 +184,7 @@ void LLTexUnit::disable(void)
{
activate();
unbind(mCurrTexType);
+ gGL.flush();
glDisable(sGLTextureType[mCurrTexType]);
mCurrTexType = TT_NONE;
}
@@ -386,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]);
@@ -400,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);
@@ -567,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);
}
@@ -577,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);
@@ -709,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 );
}
}
@@ -718,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 );
}
}
@@ -853,7 +866,15 @@ void LLRender::scaleUI(F32 x, F32 y, F32 z)
void LLRender::pushUIMatrix()
{
- mUIOffset.push_front(mUIOffset.front());
+ 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));
@@ -1105,6 +1126,33 @@ void LLRender::flush()
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);
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index 532b6b6524..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,7 @@ set(llui_SOURCE_FILES
lltextbox.cpp
lltexteditor.cpp
lltextparser.cpp
+ lltextutil.cpp
lltextvalidate.cpp
lltransutil.cpp
lltoggleablemenu.cpp
@@ -144,6 +146,7 @@ set(llui_HEADER_FILES
lllayoutstack.h
lllazyvalue.h
lllineeditor.h
+ llloadingindicator.h
lllocalcliprect.h
llmenubutton.h
llmenugl.h
@@ -183,6 +186,7 @@ set(llui_HEADER_FILES
lltextbox.h
lltexteditor.h
lltextparser.h
+ lltextutil.h
lltextvalidate.h
lltoggleablemenu.h
lltooltip.h
diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp
index 2ed1082f56..5d1d57cbb2 100644
--- a/indra/llui/llaccordionctrl.cpp
+++ b/indra/llui/llaccordionctrl.cpp
@@ -329,14 +329,34 @@ 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) );
}
+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::arrangeSinge()
{
S32 panel_left = BORDER_MARGIN; // Margin from left side of Splitter
@@ -372,11 +392,33 @@ void LLAccordionCtrl::arrangeSinge()
}
else
{
- panel_height = expanded_height;
+ 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()
@@ -626,15 +668,23 @@ 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;
+ }
+ }
+
+ if (prev_visible_tab_found)
+ {
+ accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
+ accordion_tab->notify(LLSD().with("action","select_last"));
+ return 1;
}
-
- accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
- accordion_tab->notify(LLSD().with("action","select_last"));
- return 1;
+ break;
}
}
return 0;
diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h
index 7c29e545b7..ab7d6548ca 100644
--- a/indra/llui/llaccordionctrl.h
+++ b/indra/llui/llaccordionctrl.h
@@ -92,6 +92,7 @@ public:
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
void addCollapsibleCtrl(LLView* view);
+ void removeCollapsibleCtrl(LLView* view);
void arrange();
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index 1067c3f1d5..b09c108ec3 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -32,12 +32,13 @@
#include "linden_common.h"
-#include "lluictrl.h"
-#include "llscrollbar.h"
#include "llaccordionctrltab.h"
-#include "lllocalcliprect.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";
@@ -72,7 +73,8 @@ public:
virtual BOOL postBuild();
- void setTitle(const std::string& title);
+ std::string getTitle();
+ void setTitle(const std::string& title, const std::string& hl);
virtual void onMouseEnter(S32 x, S32 y, MASK mask);
virtual void onMouseLeave(S32 x, S32 y, MASK mask);
@@ -146,10 +148,28 @@ 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,
+ LLStyle::Params(),
+ title,
+ hl);
+ }
}
void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::draw()
@@ -425,6 +445,9 @@ bool LLAccordionCtrlTab::addChild(LLView* child, S32 tab_group)
setDisplayChildren(getDisplayChildren());
}
+ if (!mContainerPanel)
+ mContainerPanel = findContainerView();
+
return res;
}
@@ -433,6 +456,47 @@ void LLAccordionCtrlTab::setAccordionView(LLView* panel)
addChild(panel,0);
}
+std::string LLAccordionCtrlTab::getTitle()
+{
+ 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);
+ }
+}
+
+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();
+}
LLView* LLAccordionCtrlTab::findContainerView()
{
@@ -465,10 +529,11 @@ 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);
@@ -504,7 +569,8 @@ BOOL LLAccordionCtrlTab::postBuild()
mScrollbar->setVisible(false);
}
- mContainerPanel->setVisible(mDisplayChildren);
+ if(mContainerPanel)
+ mContainerPanel->setVisible(mDisplayChildren);
return LLUICtrl::postBuild();
}
@@ -549,7 +615,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")
@@ -826,9 +893,6 @@ void LLAccordionCtrlTab::draw()
LLLocalClipRect clip(child_rect);
drawChild(root_rect,mContainerPanel);
}
-
-
- gGL.getTexUnit(0)->disable();
}
}
@@ -861,5 +925,14 @@ void LLAccordionCtrlTab::ctrlSetLeftTopAndSize(LLView* panel, S32 left, S32 top,
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);
+}
diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h
index 462ccc6d53..f5b7fd0af6 100644
--- a/indra/llui/llaccordionctrltab.h
+++ b/indra/llui/llaccordionctrltab.h
@@ -35,8 +35,9 @@
#include <string>
#include "llrect.h"
+#include "lluictrl.h"
+#include "lluicolor.h"
-class LLUICtrl;
class LLUICtrlFactory;
class LLUIImage;
class LLButton;
@@ -112,6 +113,14 @@ public:
void setAccordionView(LLView* panel);
LLView* getAccordionView() { return mContainerPanel; };
+ std::string getTitle();
+
+ // Set text and highlight substring in LLAccordionCtrlTabHeader
+ void setTitle(const std::string& title, const std::string& hl = LLStringUtil::null);
+
+ boost::signals2::connection setFocusReceivedCallback(const focus_signal_t::slot_type& cb);
+ boost::signals2::connection setFocusLostCallback(const focus_signal_t::slot_type& cb);
+
bool getCollapsible() {return mCollapsible;};
void setCollapsible(bool collapsible) {mCollapsible = collapsible;};
@@ -147,6 +156,8 @@ public:
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 addChild(LLView* child, S32 tab_group);
bool isExpanded() { return mDisplayChildren; }
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 1d4dc35cee..0255061b12 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -824,7 +824,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:
@@ -1003,6 +1003,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;
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 59b551a16d..a4d81ed6c3 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -217,7 +217,7 @@ public:
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 +246,7 @@ public:
void setImageHoverUnselected(LLPointer<LLUIImage> image);
void setImageDisabled(LLPointer<LLUIImage> image);
void setImageDisabledSelected(LLPointer<LLUIImage> image);
+ void setImagePressed(LLPointer<LLUIImage> image);
void setCommitOnReturn(BOOL commit) { mCommitOnReturn = commit; }
BOOL getCommitOnReturn() const { return mCommitOnReturn; }
diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp
index c1d512e148..cc107c972d 100644
--- a/indra/llui/llcombobox.cpp
+++ b/indra/llui/llcombobox.cpp
@@ -495,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);
@@ -706,14 +705,17 @@ void LLComboBox::onListMouseUp()
void LLComboBox::onItemSelected(const LLSD& data)
{
- setValue(data);
-
- if (mAllowTextEntry && mLastSelectedIndex != -1)
+ mLastSelectedIndex = getCurrentIndex();
+ if (mLastSelectedIndex != -1)
{
- gFocusMgr.setKeyboardFocus(mTextEntry);
- mTextEntry->selectAll();
- }
+ setLabel(getSelectedItemLabel());
+ if (mAllowTextEntry)
+ {
+ gFocusMgr.setKeyboardFocus(mTextEntry);
+ mTextEntry->selectAll();
+ }
+ }
// hiding the list reasserts the old value stored in the text editor/dropdown button
hideList();
@@ -1080,24 +1082,6 @@ LLIconsComboBox::LLIconsComboBox(const LLIconsComboBox::Params& p)
mLabelColumnIndex(p.label_column)
{}
-void LLIconsComboBox::setValue(const LLSD& value)
-{
- BOOL found = mList->selectByValue(value);
- if (found)
- {
- LLScrollListItem* item = mList->getFirstSelected();
- if (item)
- {
- setLabel(getSelectedItemLabel());
- }
- mLastSelectedIndex = mList->getFirstSelectedIndex();
- }
- else
- {
- mLastSelectedIndex = -1;
- }
-}
-
const std::string LLIconsComboBox::getSelectedItemLabel(S32 column) const
{
mButton->setImageOverlay(LLComboBox::getSelectedItemLabel(mIconColumnIndex), mButton->getImageOverlayHAlign());
diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h
index 965061ead2..f0bd432f3a 100644
--- a/indra/llui/llcombobox.h
+++ b/indra/llui/llcombobox.h
@@ -221,7 +221,6 @@ protected:
LLPointer<LLUIImage> mArrowImage;
LLUIString mLabel;
BOOL mHasAutocompletedText;
- S32 mLastSelectedIndex;
private:
BOOL mAllowTextEntry;
@@ -232,6 +231,7 @@ private:
commit_callback_t mTextEntryCallback;
commit_callback_t mSelectionCallback;
boost::signals2::connection mTopLostSignalConnection;
+ S32 mLastSelectedIndex;
};
// A combo box with icons for the list of items.
@@ -247,7 +247,6 @@ public:
Params();
};
- /*virtual*/ void setValue(const LLSD& value);
/*virtual*/ const std::string getSelectedItemLabel(S32 column = 0) const;
private:
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 2e5aeec41d..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;
@@ -504,7 +526,80 @@ void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask)
//*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);
}
@@ -558,15 +653,6 @@ BOOL LLFlatListView::handleKeyHere(KEY key, MASK mask)
}
break;
}
- case 'A':
- {
- if(MASK_CONTROL & mask)
- {
- selectAll();
- handled = TRUE;
- }
- break;
- }
default:
break;
}
@@ -676,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;
}
@@ -692,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()
@@ -717,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
@@ -758,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();
@@ -814,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
@@ -953,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
@@ -1061,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 33895ac22a..6babaf936b 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"),
@@ -346,7 +347,7 @@ void LLFloater::layoutDragHandle()
rect = getLocalRect();
}
mDragHandle->setRect(rect);
- updateButtons();
+ updateTitleButtons();
applyTitle();
}
@@ -563,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
@@ -603,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;
@@ -761,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);
@@ -1061,11 +1071,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 )
@@ -1121,6 +1130,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
@@ -1190,7 +1200,7 @@ void LLFloater::setHost(LLMultiFloater* host)
mButtonScale = 1.f;
//mButtonsEnabled[BUTTON_TEAR_OFF] = FALSE;
}
- updateButtons();
+ updateTitleButtons();
if (host)
{
mHostHandle = host->getHandle();
@@ -1354,7 +1364,6 @@ void LLFloater::bringToFront( S32 x, S32 y )
// virtual
void LLFloater::setVisibleAndFrontmost(BOOL take_focus)
{
- LLUI::clearPopups();
setVisible(TRUE);
setFrontmost(take_focus);
}
@@ -1390,7 +1399,7 @@ void LLFloater::setCanDock(bool b)
mButtonsEnabled[BUTTON_DOCK] = FALSE;
}
}
- updateButtons();
+ updateTitleButtons();
}
void LLFloater::setDocked(bool docked, bool pop_on_undock)
@@ -1399,7 +1408,7 @@ void LLFloater::setDocked(bool docked, bool pop_on_undock)
{
mDocked = docked;
mButtonsEnabled[BUTTON_DOCK] = !mDocked;
- updateButtons();
+ updateTitleButtons();
storeDockStateControl();
}
@@ -1452,7 +1461,7 @@ void LLFloater::onClickTearOff(LLFloater* self)
}
self->setTornOff(false);
}
- self->updateButtons();
+ self->updateTitleButtons();
}
// static
@@ -1692,7 +1701,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)
@@ -1700,7 +1709,7 @@ void LLFloater::setCanClose(BOOL can_close)
mCanClose = can_close;
mButtonsEnabled[BUTTON_CLOSE] = can_close;
- updateButtons();
+ updateTitleButtons();
}
void LLFloater::setCanTearOff(BOOL can_tear_off)
@@ -1708,7 +1717,7 @@ void LLFloater::setCanTearOff(BOOL can_tear_off)
mCanTearOff = can_tear_off;
mButtonsEnabled[BUTTON_TEAR_OFF] = mCanTearOff && !mHostHandle.isDead();
- updateButtons();
+ updateTitleButtons();
}
@@ -1732,10 +1741,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++)
{
@@ -1786,6 +1796,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
@@ -1797,7 +1819,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)
@@ -1845,7 +1870,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);
@@ -1854,7 +1879,7 @@ void LLFloater::buildButtons(const Params& floater_params)
mButtons[i] = buttonp;
}
- updateButtons();
+ updateTitleButtons();
}
// static
@@ -1900,8 +1925,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];
}
@@ -2687,6 +2719,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)
{
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 97d2bda594..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()
@@ -311,19 +312,26 @@ protected:
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();
@@ -366,6 +374,7 @@ private:
BOOL mCanClose;
BOOL mDragOnLeft;
BOOL mResizable;
+ bool mOpenCentered;
S32 mMinWidth;
S32 mMinHeight;
@@ -425,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/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/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 483a394bbd..45f9de8e8d 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -91,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),
@@ -136,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),
@@ -192,12 +190,8 @@ LLLineEditor::~LLLineEditor()
{
mCommitOnFocusLost = FALSE;
+ // calls onCommit() while LLLineEditor still valid
gFocusMgr.releaseFocusIfNeeded( this );
-
- if( gEditMenuHandler == this )
- {
- gEditMenuHandler = NULL;
- }
}
@@ -497,6 +491,7 @@ void LLLineEditor::selectAll()
setCursor(mSelectionEnd);
//mScrollHPos = 0;
mIsSelecting = TRUE;
+ updatePrimary();
}
@@ -788,7 +783,7 @@ void LLLineEditor::removeChar()
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
}
@@ -827,7 +822,7 @@ void LLLineEditor::addChar(const llwchar uni_char)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
getWindow()->hideCursorUntilMouseMove();
@@ -916,7 +911,7 @@ BOOL LLLineEditor::handleSelectionKey(KEY key, MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
break;
@@ -932,7 +927,7 @@ BOOL LLLineEditor::handleSelectionKey(KEY key, MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
break;
@@ -958,22 +953,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
@@ -1020,7 +999,7 @@ void LLLineEditor::cut()
if( need_to_rollback )
{
rollback.doRollback( this );
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
else
if( mKeystrokeCallback )
@@ -1129,7 +1108,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);
@@ -1141,7 +1120,7 @@ void LLLineEditor::pasteHelper(bool is_primary)
if( need_to_rollback )
{
rollback.doRollback( this );
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
else
if( mKeystrokeCallback )
@@ -1206,7 +1185,7 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
}
handled = TRUE;
@@ -1255,7 +1234,7 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
handled = TRUE;
}
@@ -1282,7 +1261,7 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
handled = TRUE;
}
@@ -1299,7 +1278,7 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
handled = TRUE;
}
@@ -1316,7 +1295,7 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
handled = TRUE;
}
@@ -1339,64 +1318,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;
}
@@ -1451,7 +1372,7 @@ BOOL LLLineEditor::handleKeyHere(KEY key, MASK mask )
{
rollback.doRollback(this);
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
// Notify owner if requested
@@ -1499,7 +1420,7 @@ BOOL LLLineEditor::handleUnicodeCharHere(llwchar uni_char)
{
rollback.doRollback( this );
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
// Notify owner if requested
@@ -1519,7 +1440,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()
@@ -1544,7 +1465,7 @@ void LLLineEditor::doDelete()
if( need_to_rollback )
{
rollback.doRollback( this );
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
else
{
@@ -1879,11 +1800,6 @@ S32 LLLineEditor::findPixelNearestPos(const S32 cursor_offset) const
return result;
}
-void LLLineEditor::reportBadKeystroke()
-{
- make_ui_sound("UISndBadKeystroke");
-}
-
//virtual
void LLLineEditor::clear()
{
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index b62138426b..9489e723e3 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -81,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;
@@ -215,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;
@@ -247,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);
@@ -325,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 0d56c5ed31..b77126996e 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -3345,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();
@@ -3420,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)
@@ -3455,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;
}
@@ -3478,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);
}
@@ -3727,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.
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 39d1986461..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
diff --git a/indra/llui/llmultifloater.cpp b/indra/llui/llmultifloater.cpp
index 33d47a3f0e..3aea648562 100644
--- a/indra/llui/llmultifloater.cpp
+++ b/indra/llui/llmultifloater.cpp
@@ -345,13 +345,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/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/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/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/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index 18ec5b51dd..94eade06ad 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -282,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));
}
@@ -324,11 +326,6 @@ LLScrollListCtrl::~LLScrollListCtrl()
delete mSortCallback;
std::for_each(mItemList.begin(), mItemList.end(), DeletePointer());
-
- if( gEditMenuHandler == this )
- {
- gEditMenuHandler = NULL;
- }
}
@@ -630,9 +627,7 @@ void LLScrollListCtrl::calcColumnWidths()
LLScrollListCell* cellp = (*iter)->getColumn(column->mIndex);
if (!cellp) continue;
- // get text value width only for text cells
- column->mMaxContentWidth = cellp->isText() ?
- llmax(LLFontGL::getFontSansSerifSmall()->getWidth(cellp->getValue().asString()) + mColumnPadding + COLUMN_TEXT_PADDING, column->mMaxContentWidth) : column->mMaxContentWidth;
+ column->mMaxContentWidth = llmax(LLFontGL::getFontSansSerifSmall()->getWidth(cellp->getValue().asString()) + mColumnPadding + COLUMN_TEXT_PADDING, column->mMaxContentWidth);
}
max_item_width += column->mMaxContentWidth;
@@ -959,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)))
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index ebdc82115f..1f0ef585db 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -379,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)
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 80ee5d0984..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())
@@ -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 491cd7b6f3..b47f21ed8a 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -457,3 +457,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/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 851fb966ec..0e542ad05c 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -246,7 +246,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 +350,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 +363,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)
@@ -958,7 +963,7 @@ void LLTextBase::reshape(S32 width, S32 height, BOOL called_from_parent)
if (width != getRect().getWidth() || height != getRect().getHeight())
{
LLUICtrl::reshape( width, height, called_from_parent );
-
+
// do this first after reshape, because other things depend on
// up-to-date mVisibleTextRect
updateRects();
@@ -1043,6 +1048,13 @@ void LLTextBase::setValue(const LLSD& value )
}
//virtual
+BOOL LLTextBase::canDeselect() const
+{
+ return hasSelection();
+}
+
+
+//virtual
void LLTextBase::deselect()
{
mSelectionStart = 0;
@@ -1093,8 +1105,19 @@ void LLTextBase::reflow()
updateSegments();
+ 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)
+ {
+ lldebugs << "Breaking out of reflow due to possible infinite loop in " << getName() << llendl;
+ break;
+ }
S32 start_index = mReflowIndex;
mReflowIndex = S32_MAX;
@@ -1484,6 +1507,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));
@@ -1813,11 +1837,18 @@ 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);
+ bool newline = segmentp->getDimensions(line_seg_offset, segment_line_length, text_width, text_height);
+
+ // 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
- || (hit_past_end_of_line && (segmentp->getEnd() >= line_iter->mDocIndexEnd - 1))) // or this segment wraps to next line
+ || newline) // or this line ends with a newline, set doc pos to newline char
{
// Figure out which character we're nearest to.
S32 offset;
@@ -1841,6 +1872,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 start of next line (represented by mDocIndexEnd)
+ pos = llmin(getLength(), line_iter->mDocIndexEnd);
+ break;
+ }
+
start_x += text_width;
}
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 5b24c63557..8ed0680df9 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -132,6 +132,7 @@ public:
/*virtual*/ LLTextViewModel* getViewModel() const;
// LLEditMenuHandler interface
+ /*virtual*/ BOOL canDeselect() const;
/*virtual*/ void deselect();
// used by LLTextSegment layout code
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 7d230f7d42..4fd62045e8 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -240,7 +240,6 @@ LLTextEditor::Params::Params()
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),
@@ -258,7 +257,6 @@ 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),
@@ -305,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());
@@ -507,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())
@@ -668,6 +645,7 @@ void LLTextEditor::selectAll()
mSelectionStart = getLength();
mSelectionEnd = 0;
setCursorPos(mSelectionEnd);
+ updatePrimary();
}
BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
@@ -735,7 +713,8 @@ 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(getShowContextMenu())
{
@@ -1025,7 +1004,7 @@ void LLTextEditor::removeCharOrTab()
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
}
@@ -1048,7 +1027,7 @@ void LLTextEditor::removeChar()
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
}
@@ -1198,22 +1177,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
@@ -1247,6 +1210,7 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)
case KEY_DOWN:
changeLine( 1 );
+ deselect();
break;
case KEY_PAGE_DOWN:
@@ -1260,7 +1224,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
{
@@ -1270,7 +1234,7 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
}
break;
@@ -1278,7 +1242,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
{
@@ -1288,7 +1252,7 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
}
break;
@@ -1299,6 +1263,11 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)
}
}
+ if (handled)
+ {
+ deselect();
+ }
+
return handled;
}
@@ -1551,75 +1520,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 )
- {
- if( canDoDelete() )
- {
- doDelete();
- }
- else
- {
- reportBadKeystroke();
- }
- handled = TRUE;
- }
- else
- if( MASK_CONTROL & mask )
+BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK 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:
@@ -1641,7 +1548,7 @@ BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask, BOOL* return
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
break;
@@ -1694,6 +1601,10 @@ BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask, BOOL* return
break;
}
+ if (handled)
+ {
+ onKeyStroke();
+ }
return handled;
}
@@ -1714,9 +1625,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.
@@ -1724,116 +1632,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();
}
@@ -2334,7 +2150,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;
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index 71d937b2c4..9b3ab9414c 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -68,7 +68,6 @@ public:
Optional<bool> embedded_items,
ignore_tab,
- handle_edit_keys_directly,
show_line_numbers,
commit_on_focus_lost,
show_context_menu;
@@ -146,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);
@@ -218,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);
@@ -329,10 +323,6 @@ private:
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;
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/llui.cpp b/indra/llui/llui.cpp
index 5121ef5351..bf12384a28 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -56,6 +56,7 @@
#include "llfloaterreg.h"
#include "llmenugl.h"
#include "llmenubutton.h"
+#include "llloadingindicator.h"
#include "llwindow.h"
// for registration
@@ -94,7 +95,10 @@ std::list<std::string> gUntranslated;
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");
//
@@ -207,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);
@@ -1914,7 +1918,12 @@ void LLUI::clearPopups()
}
}
-
+//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)
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index 30f3623ded..c18262ef76 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -217,6 +217,8 @@ public:
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
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/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 35428e4227..fd56a87345 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -41,6 +41,9 @@
#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)
@@ -303,14 +306,14 @@ 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";
- mTooltip = LLTrans::getString("TooltipAgentUrl");
mColor = LLUIColorTable::instance().getColor("AgentLinkColor");
}
@@ -323,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)
@@ -346,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
@@ -362,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";
@@ -426,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";
}
@@ -437,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");
@@ -459,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");
@@ -504,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");
@@ -525,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
@@ -624,7 +722,7 @@ std::string LLUrlEntrySLLabel::getTooltip(const std::string &string) const
//
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");
@@ -647,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";
@@ -680,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 c947ef7259..71f030677a 100644
--- a/indra/llui/llurlentry.h
+++ b/indra/llui/llurlentry.h
@@ -77,7 +77,7 @@ 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; }
@@ -169,6 +169,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 +201,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.,
@@ -283,4 +296,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/llurlregistry.cpp b/indra/llui/llurlregistry.cpp
index faa02e1904..4341286eb4 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)
@@ -175,7 +179,7 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL
match_entry->getUrl(url),
match_entry->getLabel(url, cb),
match_entry->getTooltip(url),
- match_entry->getIcon(),
+ match_entry->getIcon(url),
match_entry->getColor(),
match_entry->getMenuName(),
match_entry->getLocation(url),
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index d34083a384..bd56da9121 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -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"),
@@ -152,7 +150,7 @@ LLView::~LLView()
//llinfos << "Deleting view " << mName << ":" << (void*) this << llendl;
if (LLView::sIsDrawing)
{
- llwarns << "Deleting view " << mName << " during UI draw() phase" << llendl;
+ lldebugs << "Deleting view " << mName << " during UI draw() phase" << llendl;
}
// llassert(LLView::sIsDrawing == FALSE);
@@ -1325,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);
@@ -1349,8 +1346,6 @@ void LLView::drawChildren()
}
--sDepth;
}
-
- gGL.getTexUnit(0)->disable();
}
void LLView::dirtyRect()
@@ -2502,7 +2497,6 @@ void LLView::applyXUILayout(LLView::Params& p, LLView* parent)
p.layout = parent->getLayout();
}
-
if (parent)
{
LLRect parent_rect = parent->getLocalRect();
@@ -2510,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 efae00f0e5..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,
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/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/llwindow.cpp b/indra/llwindow/llwindow.cpp
index b77deb003f..1c6c9e6e9d 100644
--- a/indra/llwindow/llwindow.cpp
+++ b/indra/llwindow/llwindow.cpp
@@ -407,30 +407,3 @@ BOOL LLWindowManager::isWindowValid(LLWindow *window)
{
return sWindowList.find(window) != sWindowList.end();
}
-
-S32 LLDisplayInfo::getDisplayWidth() const
-{
-#if LL_WINDOWS
- return LLWindowWin32::getDisplayWidth();
-#elif LL_DARWIN
- return LLWindowMacOSX::getDisplayWidth();
-#elif LL_SDL
- return LLWindowSDL::getDisplayWidth();
-#else
- return 1024; //*FIXME
-#endif
-}
-
-S32 LLDisplayInfo::getDisplayHeight() const
-{
-#if LL_WINDOWS
- return LLWindowWin32::getDisplayHeight();
-#elif LL_DARWIN
- return LLWindowMacOSX::getDisplayHeight();
-#elif LL_SDL
- return LLWindowSDL::getDisplayHeight();
-#else
- return 768; //*FIXME
-#endif
-}
-
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index b769f5071b..52132c38d3 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -160,7 +160,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) {};
static std::vector<std::string> getDynamicFallbackFontList();
@@ -281,19 +281,4 @@ extern const std::string gURLProtocolWhitelistHandler[];
void simpleEscapeString ( std::string& stringIn );
-//=============================================================================
-//
-// CLASS LLDisplayInfo
-class LLDisplayInfo
-
-/*! @brief Class to query the information about some display settings
-*/
-{
-public:
- LLDisplayInfo(){}; ///< Default constructor
-
- S32 getDisplayWidth() const; ///< display width
- S32 getDisplayHeight() const; ///< display height
-};
-
#endif // _LL_window_h_
diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h
index ed8c874dcb..ed5d7b1e74 100644
--- a/indra/llwindow/llwindowmacosx-objc.h
+++ b/indra/llwindow/llwindowmacosx-objc.h
@@ -40,5 +40,4 @@ void setupCocoa();
CursorRef createImageCursor(const char *fullpath, int hotspotX, int hotspotY);
OSErr releaseImageCursor(CursorRef ref);
OSErr setImageCursor(CursorRef ref);
-void getScreenSize(int* width, int* height);
-void getVisibleScreen(int *x, int *y, int* width, int* height);
+
diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm
index 5cab2619fd..59b25e1726 100644
--- a/indra/llwindow/llwindowmacosx-objc.mm
+++ b/indra/llwindow/llwindowmacosx-objc.mm
@@ -116,22 +116,3 @@ OSErr setImageCursor(CursorRef ref)
return noErr;
}
-void getScreenSize(int* width, int* height)
-{
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- NSRect screen_rect = [[NSScreen mainScreen] frame];
- if (width) *width = (int)(screen_rect.size.width);
- if (height) *height = (int)(screen_rect.size.height);
- [pool release];
-}
-
-void getVisibleScreen(int *x, int *y, int* width, int* height)
-{
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- NSRect visible_rect = [[NSScreen mainScreen] visibleFrame];
- if (width) *width = (int)(visible_rect.size.width);
- if (height) *height = (int)(visible_rect.size.height);
- if (x) *x = (int)(visible_rect.origin.x);
- if (y) *y = (int)(visible_rect.origin.y);
- [pool release];
-}
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index 924acaf148..7026a3f7a6 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -1122,33 +1122,7 @@ BOOL LLWindowMacOSX::getMaximized()
BOOL LLWindowMacOSX::maximize()
{
- if (mWindow)
- {
- // *HACK: Because Mac OSX doesn't have a concept of a "maximized" window, we just
- // stretch it out to the visible screen size.
- Rect win_rect;
-
- int visible_x;
- int visible_y;
- int visible_width;
- int visible_height;
- int screen_width;
- int screen_height;
-
- getScreenSize(&screen_width, &screen_height);
- getVisibleScreen(&visible_x, &visible_y, &visible_width, &visible_height);
-
- int mac_os_menu_bar_height = screen_height - (visible_height + visible_y);
- ::SetRect(&win_rect,
- visible_x,
- mac_os_menu_bar_height,
- visible_width + visible_x,
- visible_height + mac_os_menu_bar_height);
-
- ::SetWindowBounds(mWindow, kWindowStructureRgn, &win_rect);
-
- return TRUE;
- }
+ // TODO
return FALSE;
}
@@ -2807,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;
@@ -2909,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;
@@ -2950,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);
@@ -3195,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;
@@ -3490,26 +3473,6 @@ MASK LLWindowMacOSX::modifiersToMask(SInt16 modifiers)
return mask;
}
-// static
-S32 LLWindowMacOSX::getDisplayWidth()
-{
- S32 width = 1024;
- // Need to invoke cocoa before use getScreenSize()
- setupCocoa();
- getScreenSize(&width, NULL);
- return width;
-}
-
-// static
-S32 LLWindowMacOSX::getDisplayHeight()
-{
- S32 height = 768;
- // Need to invoke cocoa before use getScreenSize()
- setupCocoa();
- getScreenSize(NULL, &height);
- return height;
-}
-
#if LL_OS_DRAGDROP_ENABLED
OSErr LLWindowMacOSX::dragTrackingHandler(DragTrackingMessage message, WindowRef theWindow,
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h
index 86036a261c..5ac74bb004 100644
--- a/indra/llwindow/llwindowmacosx.h
+++ b/indra/llwindow/llwindowmacosx.h
@@ -116,15 +116,13 @@ 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();
- static S32 getDisplayWidth();
- static S32 getDisplayHeight();
protected:
LLWindowMacOSX(LLWindowCallbacks* callbacks,
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index cb4e04511c..399d284402 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -187,47 +187,6 @@ Display* LLWindowSDL::get_SDL_Display(void)
}
#endif // LL_X11
-// static
-S32 LLWindowSDL::getDisplayWidth()
-{
-#if LL_GTK
- if (LLWindowSDL::ll_try_gtk_init())
- {
- return gdk_screen_width();
- }
-#endif // LL_GTK
-
-#if LL_X11
- Display *display = XOpenDisplay(NULL);
- int screen_num = DefaultScreen(display);
- S32 width = DisplayWidth(display, screen_num);
- XCloseDisplay(display);
- return width;
-#endif //LL_X11
-
- return 1024;
-}
-
-// static
-S32 LLWindowSDL::getDisplayHeight()
-{
-#if LL_GTK
- if (LLWindowSDL::ll_try_gtk_init())
- {
- return gdk_screen_height();
- }
-#endif // LL_GTK
-
-#if LL_X11
- Display *display = XOpenDisplay(NULL);
- int screen_num = DefaultScreen(display);
- S32 height = DisplayHeight(display, screen_num);
- XCloseDisplay(display);
- return height;
-#endif //LL_X11
-
- return 768;
-}
LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks,
const std::string& title, S32 x, S32 y, S32 width,
@@ -950,68 +909,7 @@ BOOL LLWindowSDL::getMaximized()
if (mWindow)
{
-#if LL_X11
- if (mSDL_Display)
- {
- maybe_lock_display();
-
- // Return data in the specified format, XA_ATOM.
- U8* prop;
- // Actual format of the property.
- int format;
- // Actual number of items stored in the prop return data.
- unsigned long nitems;
- // Number of bytes remaining to be read in the property if a partial read was performed.
- unsigned long bytes_after;
- // Atom identifier that defines the actual type of the property.
- Atom type;
-
- // Atom used to obtain list of hints describing the window state.
- Atom wm_state = XInternAtom(mSDL_Display, "_NET_WM_STATE", False);
-
- // Atoms indicates that the window is vertically/horizontally maximized.
- Atom max_vert = XInternAtom(mSDL_Display, "_NET_WM_STATE_MAXIMIZED_VERT", False);
- Atom max_horz = XInternAtom(mSDL_Display, "_NET_WM_STATE_MAXIMIZED_HORZ", False);
-
- // How many atoms in which we interested are present in list of hints.
- U32 pass = 0;
-
- do
- {
- nitems = 0;
- bytes_after = 0;
- type = None;
- if ( (XGetWindowProperty (mSDL_Display,
- mSDL_XWindowID,
- wm_state,
- 0, UINT_MAX,
- False, XA_ATOM,
- &type, &format,
- &nitems, &bytes_after,
- &prop) == Success)
- && type != None )
- {
- Atom *atoms = (Atom *)prop;
- for (unsigned long i=0; i<nitems; ++i)
- {
- if (atoms[i] == max_horz)
- ++pass;
- else if (atoms[i] == max_vert)
- ++pass;
- }
- XFree (atoms);
- }
- else
- {
- break;
- }
- } while (bytes_after > 0);
-
- result = (pass == 2);
-
- maybe_unlock_display();
- }
-#endif // LL_X11
+ // TODO
}
return(result);
@@ -1019,103 +917,7 @@ BOOL LLWindowSDL::getMaximized()
BOOL LLWindowSDL::maximize()
{
-#if LL_X11
- if (mSDL_Display && !mFullscreen)
- {
- maybe_lock_display();
-
- BOOL is_maximize_allowed = FALSE;
-
- // Check if maximize is allowed
- {
- // Return data in the specified format, XA_ATOM.
- U8* prop;
- // Actual format of the property.
- int format;
- // Actual number of items stored in the prop return data.
- unsigned long nitems;
- // Number of bytes remaining to be read in the property if a partial read was performed.
- unsigned long bytes_after;
- // Atom identifier that defines the actual type of the property.
- Atom type;
-
- // Atom used to obtain a list of atoms indicating user operations that the Window Manager supports for this window.
- Atom allowed_act = XInternAtom(mSDL_Display, "_NET_WM_ALLOWED_ACTIONS", False);
-
- // Atoms that indicates that the window may be vertically/horizontally maximized.
- Atom max_vert_act = XInternAtom(mSDL_Display, "_NET_WM_ACTION_MAXIMIZE_HORZ", False);
- Atom max_horz_act = XInternAtom(mSDL_Display, "_NET_WM_ACTION_MAXIMIZE_VERT", False);
-
- // How many atoms in which we interested are present in list of hints.
- U32 pass = 0;
-
- do
- {
- nitems = 0;
- bytes_after = 0;
- type = None;
- if ( (XGetWindowProperty (mSDL_Display,
- mSDL_XWindowID,
- allowed_act,
- 0, UINT_MAX,
- False, XA_ATOM,
- &type, &format,
- &nitems, &bytes_after,
- &prop) == Success)
- && type != None )
- {
- Atom *atoms = (Atom *)prop;
- for (unsigned long i=0; i<nitems; ++i)
- {
- if (atoms[i] == max_vert_act)
- ++pass;
- else if (atoms[i] == max_horz_act)
- ++pass;
- }
- XFree (atoms);
- }
- else
- {
- break;
- }
- } while (bytes_after > 0);
-
- is_maximize_allowed = (pass == 2);
- }
-
- // Send maximize event to X11 system
- if (is_maximize_allowed)
- {
- XEvent xev;
-
- // Atom describing the window state.
- Atom wm_state = XInternAtom(mSDL_Display, "_NET_WM_STATE", False);
-
- // Atoms indicates that the window is vertically/horizontally maximized.
- Atom max_vert = XInternAtom(mSDL_Display, "_NET_WM_STATE_MAXIMIZED_VERT", False);
- Atom max_horz = XInternAtom(mSDL_Display, "_NET_WM_STATE_MAXIMIZED_HORZ", False);
-
- memset(&xev, 0, sizeof(xev));
- xev.type = ClientMessage;
- xev.xclient.window = mSDL_XWindowID;
- xev.xclient.message_type = wm_state;
- xev.xclient.format = 32;
- xev.xclient.data.l[0] = 1; // add/set property
- xev.xclient.data.l[1] = max_vert;
- xev.xclient.data.l[2] = max_horz;
- xev.xclient.data.l[3] = 0;
- xev.xclient.data.l[4] = 0;
-
- XSendEvent(mSDL_Display,
- DefaultRootWindow(mSDL_Display),
- False,
- SubstructureNotifyMask, &xev);
- }
-
- maybe_unlock_display();
- return is_maximize_allowed;
- }
-#endif // LL_X11
+ // TODO
return FALSE;
}
@@ -2272,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;
@@ -2663,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;
@@ -2741,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,
@@ -2756,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;
@@ -2800,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],
@@ -2814,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);
@@ -2827,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 2311a361fa..8e65a2f324 100644
--- a/indra/llwindow/llwindowsdl.h
+++ b/indra/llwindow/llwindowsdl.h
@@ -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();
@@ -148,9 +148,6 @@ public:
static Display* get_SDL_Display(void);
#endif // LL_X11
- static S32 getDisplayWidth();
- static S32 getDisplayHeight();
-
protected:
LLWindowSDL(LLWindowCallbacks* callbacks,
const std::string& title, int x, int y, int width, int height, U32 flags,
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 4be5d06c2b..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>
@@ -1543,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++ )
@@ -2873,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
@@ -2953,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;
@@ -2983,84 +2995,16 @@ 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);
-
- // Convert executable and path to wide string for Windows API
- llutf16string browser_exec_utf16 = wstring_to_utf16str(browser_executable);
-
- // 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;
- }
- */
}
/*
@@ -3714,16 +3658,5 @@ std::vector<std::string> LLWindowWin32::getDynamicFallbackFontList()
return std::vector<std::string>();
}
-// static
-S32 LLWindowWin32::getDisplayWidth()
-{
- return ::GetSystemMetrics(SM_CXVIRTUALSCREEN);
-}
-
-// static
-S32 LLWindowWin32::getDisplayHeight()
-{
- return ::GetSystemMetrics(SM_CYVIRTUALSCREEN);
-}
#endif // LL_WINDOWS
diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h
index c221ec0192..d4a3446515 100644
--- a/indra/llwindow/llwindowwin32.h
+++ b/indra/llwindow/llwindowwin32.h
@@ -114,15 +114,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);
LLWindowCallbacks::DragNDropResult completeDragNDropRequest( const LLCoordGL gl_coord, const MASK mask, LLWindowCallbacks::DragNDropAction action, const std::string url );
static std::vector<std::string> getDynamicFallbackFontList();
- static S32 getDisplayWidth();
- static S32 getDisplayHeight();
-
protected:
LLWindowWin32(LLWindowCallbacks* callbacks,
const std::string& title, const std::string& name, int x, int y, int width, int height, U32 flags,
diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp
index 2ead5a4a57..8d6aa405e2 100644
--- a/indra/llxuixml/llinitparam.cpp
+++ b/indra/llxuixml/llinitparam.cpp
@@ -139,7 +139,7 @@ namespace LLInitParam
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);
@@ -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;
@@ -460,7 +460,7 @@ namespace LLInitParam
// NOTE: this requires that "other" is of the same derived type as this
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;
@@ -471,10 +471,10 @@ namespace LLInitParam
if (merge_func)
{
Param* paramp = getParamFromHandle(it->mParamHandle);
- param_changed |= merge_func(*paramp, *other_paramp, overwrite);
+ 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 c9c1d4af90..b645c4be7c 100644
--- a/indra/llxuixml/llinitparam.h
+++ b/indra/llxuixml/llinitparam.h
@@ -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)
@@ -507,7 +507,7 @@ namespace LLInitParam
BlockDescriptor* mBlockDescriptor; // most derived block descriptor
- static BlockDescriptor& blockDescriptor()
+ static BlockDescriptor& selfBlockDescriptor()
{
static BlockDescriptor sBlockDescriptor;
return sBlockDescriptor;
@@ -559,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,
@@ -584,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;
@@ -690,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;
@@ -722,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,
@@ -741,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;
}
@@ -856,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;
}
@@ -911,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,
@@ -1060,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;
@@ -1094,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,
@@ -1252,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;
@@ -1282,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::merge(blockDescriptor(), other, true);
+ 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;
}
@@ -1314,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.
@@ -1331,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);
}
@@ -1382,7 +1385,7 @@ namespace LLInitParam
};
protected:
- static BlockDescriptor& blockDescriptor()
+ static BlockDescriptor& selfBlockDescriptor()
{
static BlockDescriptor sBlockDescriptor;
return sBlockDescriptor;
@@ -1410,19 +1413,19 @@ namespace LLInitParam
// take all provided params from other and apply to self
bool overwriteFrom(const self_t& other)
{
- return BaseBlock::merge(blockDescriptor(), other, true);
+ 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::merge(blockDescriptor(), other, false);
+ 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));
}
//
@@ -1436,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")
}
@@ -1465,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)
@@ -1501,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();
@@ -1529,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,
@@ -1561,7 +1564,7 @@ namespace LLInitParam
typedef Deprecated Ignored;
protected:
- static BlockDescriptor& blockDescriptor()
+ static BlockDescriptor& selfBlockDescriptor()
{
static BlockDescriptor sBlockDescriptor;
return sBlockDescriptor;
@@ -1574,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;
@@ -1582,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,
@@ -1604,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)
{
@@ -1612,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;
}
@@ -1628,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;
}
}
@@ -1703,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(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
@@ -1722,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)
@@ -1731,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();
@@ -1756,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;
}
}
@@ -1763,54 +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(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_typed_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_typed_param.isProvided()
&& (overwrite || !dst_typed_param.isProvided()))
{
- // assign individual parameters
- dst_typed_param.BaseBlock::merge(block_t::blockDescriptor(), src_typed_param, overwrite);
-
- // then copy actual value
- dst_typed_param.mData.mValue = src_typed_param.get();
- dst_typed_param.mData.clearKey();
- dst_typed_param.setProvided(true);
-
- // Propagate value back to block params since the value was updated during this merge.
- // This will result in mData.mValue and the block params being in sync.
- static_cast<DERIVED&>(dst_typed_param).setBlockFromValue();
+ if (src_typed_param.mData.mValueAge == NEWER_THAN_BLOCK)
+ {
+ // copy value over
+ dst_typed_param.set(src_typed_param.get());
+ }
+ else
+ {
+ // merge individual parameters into destination
+ dst_typed_param.merge(block_t::selfBlockDescriptor(), src_typed_param, overwrite);
+ }
return true;
}
return false;
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_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/media_plugin_gstreamer010.cpp b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
index 4c2dd64bb6..033c4ba2f3 100644
--- a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
+++ b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
@@ -986,33 +986,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")
{
@@ -1077,7 +1050,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 9f66a77c64..1a559ed39c 100644
--- a/indra/media_plugins/webkit/CMakeLists.txt
+++ b/indra/media_plugins/webkit/CMakeLists.txt
@@ -36,6 +36,10 @@ set(media_plugin_webkit_SOURCE_FILES
media_plugin_webkit.cpp
)
+set(media_plugin_webkit_HEADER_FILES
+ volume_catcher.h
+ )
+
set(media_plugin_webkit_LINK_LIBRARIES
${LLPLUGIN_LIBRARIES}
${MEDIA_PLUGIN_BASE_LIBRARIES}
@@ -45,12 +49,31 @@ set(media_plugin_webkit_LINK_LIBRARIES
${PULSEAUDIO_LIBRARIES}
)
-if (LINUX)
+# Select which VolumeCatcher implementation to use
+if (LINUX AND PULSEAUDIO)
list(APPEND media_plugin_webkit_SOURCE_FILES linux_volume_catcher.cpp)
list(APPEND media_plugin_webkit_LINK_LIBRARIES
${UI_LIBRARIES} # for glib/GTK
)
-endif (LINUX)
+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 AND PULSEAUDIO)
+ # All other platforms use the dummy volume catcher for now.
+ list(APPEND media_plugin_webkit_SOURCE_FILES dummy_volume_catcher.cpp)
+endif (LINUX AND PULSEAUDIO)
+
+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
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
index 52ab766f7f..2e7fda865e 100644
--- a/indra/media_plugins/webkit/linux_volume_catcher.cpp
+++ b/indra/media_plugins/webkit/linux_volume_catcher.cpp
@@ -42,11 +42,9 @@
#include "linden_common.h"
-#include "linux_volume_catcher.h"
+#include "volume_catcher.h"
-#if LL_PULSEAUDIO_ENABLED
-
extern "C" {
#include <glib.h>
@@ -161,11 +159,11 @@ extern "C" {
}
-class LinuxVolumeCatcherImpl
+class VolumeCatcherImpl
{
public:
- LinuxVolumeCatcherImpl();
- ~LinuxVolumeCatcherImpl();
+ VolumeCatcherImpl();
+ ~VolumeCatcherImpl();
void setVolume(F32 volume);
void pump(void);
@@ -189,7 +187,7 @@ public:
bool mGotSyms;
};
-LinuxVolumeCatcherImpl::LinuxVolumeCatcherImpl()
+VolumeCatcherImpl::VolumeCatcherImpl()
: mDesiredVolume(0.0f),
mMainloop(NULL),
mPAContext(NULL),
@@ -199,17 +197,17 @@ LinuxVolumeCatcherImpl::LinuxVolumeCatcherImpl()
init();
}
-LinuxVolumeCatcherImpl::~LinuxVolumeCatcherImpl()
+VolumeCatcherImpl::~VolumeCatcherImpl()
{
cleanup();
}
-bool LinuxVolumeCatcherImpl::loadsyms(std::string pulse_dso_name)
+bool VolumeCatcherImpl::loadsyms(std::string pulse_dso_name)
{
return grab_pa_syms(pulse_dso_name);
}
-void LinuxVolumeCatcherImpl::init()
+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
@@ -262,7 +260,7 @@ void LinuxVolumeCatcherImpl::init()
}
}
-void LinuxVolumeCatcherImpl::cleanup()
+void VolumeCatcherImpl::cleanup()
{
mConnected = false;
@@ -280,7 +278,7 @@ void LinuxVolumeCatcherImpl::cleanup()
mMainloop = NULL;
}
-void LinuxVolumeCatcherImpl::setVolume(F32 volume)
+void VolumeCatcherImpl::setVolume(F32 volume)
{
mDesiredVolume = volume;
@@ -294,13 +292,13 @@ void LinuxVolumeCatcherImpl::setVolume(F32 volume)
pump();
}
-void LinuxVolumeCatcherImpl::pump()
+void VolumeCatcherImpl::pump()
{
gboolean may_block = FALSE;
g_main_context_iteration(g_main_context_default(), may_block);
}
-void LinuxVolumeCatcherImpl::connected_okay()
+void VolumeCatcherImpl::connected_okay()
{
pa_operation *op;
@@ -324,7 +322,7 @@ void LinuxVolumeCatcherImpl::connected_okay()
}
}
-void LinuxVolumeCatcherImpl::update_all_volumes(F32 volume)
+void VolumeCatcherImpl::update_all_volumes(F32 volume)
{
for (std::set<U32>::iterator it = mSinkInputIndices.begin();
it != mSinkInputIndices.end(); ++it)
@@ -333,7 +331,7 @@ void LinuxVolumeCatcherImpl::update_all_volumes(F32 volume)
}
}
-void LinuxVolumeCatcherImpl::update_index_volume(U32 index, F32 volume)
+void VolumeCatcherImpl::update_index_volume(U32 index, F32 volume)
{
static pa_cvolume cvol;
llpa_cvolume_set(&cvol, mSinkInputNumChannels[index],
@@ -355,7 +353,7 @@ void LinuxVolumeCatcherImpl::update_index_volume(U32 index, F32 volume)
void callback_discovered_sinkinput(pa_context *context, const pa_sink_input_info *sii, int eol, void *userdata)
{
- LinuxVolumeCatcherImpl *impl = dynamic_cast<LinuxVolumeCatcherImpl*>((LinuxVolumeCatcherImpl*)userdata);
+ VolumeCatcherImpl *impl = dynamic_cast<VolumeCatcherImpl*>((VolumeCatcherImpl*)userdata);
llassert(impl);
if (0 == eol)
@@ -386,7 +384,7 @@ void callback_discovered_sinkinput(pa_context *context, const pa_sink_input_info
void callback_subscription_alert(pa_context *context, pa_subscription_event_type_t t, uint32_t index, void *userdata)
{
- LinuxVolumeCatcherImpl *impl = dynamic_cast<LinuxVolumeCatcherImpl*>((LinuxVolumeCatcherImpl*)userdata);
+ VolumeCatcherImpl *impl = dynamic_cast<VolumeCatcherImpl*>((VolumeCatcherImpl*)userdata);
llassert(impl);
switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) {
@@ -420,7 +418,7 @@ void callback_subscription_alert(pa_context *context, pa_subscription_event_type
void callback_context_state(pa_context *context, void *userdata)
{
- LinuxVolumeCatcherImpl *impl = dynamic_cast<LinuxVolumeCatcherImpl*>((LinuxVolumeCatcherImpl*)userdata);
+ VolumeCatcherImpl *impl = dynamic_cast<VolumeCatcherImpl*>((VolumeCatcherImpl*)userdata);
llassert(impl);
switch (llpa_context_get_state(context))
@@ -441,48 +439,30 @@ void callback_context_state(pa_context *context, void *userdata)
/////////////////////////////////////////////////////
-LinuxVolumeCatcher::LinuxVolumeCatcher()
+VolumeCatcher::VolumeCatcher()
{
- pimpl = new LinuxVolumeCatcherImpl();
+ pimpl = new VolumeCatcherImpl();
}
-LinuxVolumeCatcher::~LinuxVolumeCatcher()
+VolumeCatcher::~VolumeCatcher()
{
delete pimpl;
pimpl = NULL;
}
-void LinuxVolumeCatcher::setVolume(F32 volume)
+void VolumeCatcher::setVolume(F32 volume)
{
llassert(pimpl);
pimpl->setVolume(volume);
}
-void LinuxVolumeCatcher::pump()
-{
- llassert(pimpl);
- pimpl->pump();
-}
-
-#else // !LL_PULSEAUDIO_ENABLED
-
-// stub.
-
-LinuxVolumeCatcher::LinuxVolumeCatcher()
-{
- pimpl = NULL;
-}
-
-LinuxVolumeCatcher::~LinuxVolumeCatcher()
+void VolumeCatcher::setPan(F32 pan)
{
+ // TODO: implement this (if possible)
}
-void LinuxVolumeCatcher::setVolume(F32 volume)
-{
-}
-
-void LinuxVolumeCatcher::pump()
+void VolumeCatcher::pump()
{
+ llassert(pimpl);
+ pimpl->pump();
}
-
-#endif // LL_PULSEAUDIO_ENABLED
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 e66ac3049f..0cd6e48d14 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -45,14 +45,12 @@
// set to 1 if you're using the version of llqtwebkit that's QPixmap-ified
#if LL_LINUX
-# define LL_QTWEBKIT_USES_PIXMAPS 1
+# define LL_QTWEBKIT_USES_PIXMAPS 0
#else
# define LL_QTWEBKIT_USES_PIXMAPS 0
#endif // LL_LINUX
-#if LL_LINUX
-# include "linux_volume_catcher.h"
-#endif // LL_LINUX
+# include "volume_catcher.h"
#if LL_WINDOWS
# include <direct.h>
@@ -88,10 +86,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
@@ -113,9 +117,7 @@ private:
F32 mBackgroundG;
F32 mBackgroundB;
-#if LL_LINUX
- LinuxVolumeCatcher mLinuxVolumeCatcher;
-#endif // LL_LINUX
+ VolumeCatcher mVolumeCatcher;
void setInitState(int state)
{
@@ -129,9 +131,7 @@ private:
{
LLQtWebKit::getInstance()->pump( milliseconds );
-#if LL_LINUX
- mLinuxVolumeCatcher.pump();
-#endif // LL_LINUX
+ mVolumeCatcher.pump();
checkEditState();
@@ -191,13 +191,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 ))
@@ -208,12 +201,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
@@ -254,66 +247,95 @@ 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 );
+ mInitState = INIT_STATE_INITIALIZED;
+
+ return true;
+ };
- // tell LLQtWebKit about the size of the browser window
- LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight );
+ return false;
+ };
- // observer events that LLQtWebKit emits
- LLQtWebKit::getInstance()->addObserver( mBrowserWindowId, this );
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ bool initBrowserWindow()
+ {
+ // already initialized
+ if ( mInitState > INIT_STATE_INITIALIZED )
+ return true;
- // append details to agent string
- LLQtWebKit::getInstance()->setBrowserAgentId( "LLPluginMedia Web Browser" );
+ // 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 );
+
+ // TODO: Remove this ifdef when the Linux version of llqtwebkit gets updated with the new WOB constant.
+#if !LL_LINUX
+ // Set up window open behavior
+ LLQtWebKit::getInstance()->setWindowOpenBehavior(mBrowserWindowId, LLQtWebKit::WOB_SIMULATE_BLANK_HREF_CLICK);
+#endif
+
#if !LL_QTWEBKIT_USES_PIXMAPS
- // don't flip bitmap
- LLQtWebKit::getInstance()->flipWindow( mBrowserWindowId, true );
+ // 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;
- };
+ // 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) );
- return false;
- };
+ // 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);
@@ -486,6 +508,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;
@@ -650,6 +685,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()
@@ -676,9 +716,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;
@@ -690,23 +727,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);
-#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(message_name == "idle")
{
@@ -771,7 +791,7 @@ 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)
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
{
if(message_name == "set_volume")
{
@@ -781,7 +801,58 @@ void MediaPluginWebKit::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.
+ 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");
@@ -803,29 +874,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;
@@ -975,8 +1053,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")
{
@@ -1013,8 +1105,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")
{
@@ -1047,9 +1139,7 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
void MediaPluginWebKit::setVolume(F32 volume)
{
-#if LL_LINUX
- mLinuxVolumeCatcher.setVolume(volume);
-#endif // LL_LINUX
+ 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)
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 8ad3b2085d..128d67d73d 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,10 +160,10 @@ 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
@@ -220,6 +225,7 @@ set(viewer_SOURCE_FILES
llfollowcam.cpp
llfriendcard.cpp
llgesturemgr.cpp
+ llgiveinventory.cpp
llglsandbox.cpp
llgroupactions.cpp
llgroupiconctrl.cpp
@@ -251,13 +257,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
@@ -292,7 +302,9 @@ set(viewer_SOURCE_FILES
llnotificationmanager.cpp
llnotificationofferhandler.cpp
llnotificationscripthandler.cpp
+ llnotificationstorage.cpp
llnotificationtiphandler.cpp
+ lloutfitslist.cpp
lloutputmonitorctrl.cpp
llpanelavatar.cpp
llpanelavatartag.cpp
@@ -301,6 +313,7 @@ set(viewer_SOURCE_FILES
llpanelcontents.cpp
llpaneleditwearable.cpp
llpanelface.cpp
+ llpanelgenerictip.cpp
llpanelgroup.cpp
llpanelgroupgeneral.cpp
llpanelgroupinvite.cpp
@@ -316,7 +329,6 @@ set(viewer_SOURCE_FILES
llpanellandmedia.cpp
llpanellogin.cpp
llpanelloginlistener.cpp
- llpanellookinfo.cpp
llpanelmaininventory.cpp
llpanelmediasettingsgeneral.cpp
llpanelmediasettingspermissions.cpp
@@ -325,6 +337,8 @@ set(viewer_SOURCE_FILES
llpanelnearbymedia.cpp
llpanelobject.cpp
llpanelobjectinventory.cpp
+ llpanelonlinestatus.cpp
+ llpaneloutfitedit.cpp
llpaneloutfitsinventory.cpp
llpanelpeople.cpp
llpanelpeoplemenus.cpp
@@ -340,6 +354,7 @@ set(viewer_SOURCE_FILES
llpanelprofile.cpp
llpanelprofileview.cpp
llpanelteleporthistory.cpp
+ llpaneltiptoast.cpp
llpanelvolume.cpp
llpanelvolumepulldown.cpp
llparcelselection.cpp
@@ -368,6 +383,8 @@ set(viewer_SOURCE_FILES
llscrollingpanelparam.cpp
llsearchcombobox.cpp
llsearchhistory.cpp
+ llsecapi.cpp
+ llsechandler_basic.cpp
llselectmgr.cpp
llsidepanelappearance.cpp
llsidepanelinventory.cpp
@@ -407,7 +424,6 @@ set(viewer_SOURCE_FILES
lltexturestats.cpp
lltexturestatsuploader.cpp
lltextureview.cpp
- lltextutil.cpp
lltoast.cpp
lltoastalertpanel.cpp
lltoastgroupnotifypanel.cpp
@@ -442,7 +458,6 @@ set(viewer_SOURCE_FILES
llurldispatcherlistener.cpp
llurlhistory.cpp
llurllineeditorctrl.cpp
- llurlsimstring.cpp
llurlwhitelist.cpp
llvectorperfoptions.cpp
llversioninfo.cpp
@@ -510,6 +525,7 @@ set(viewer_SOURCE_FILES
llvoicechannel.cpp
llvoiceclient.cpp
llvoicevisualizer.cpp
+ llvoicevivox.cpp
llvoinventorylistener.cpp
llvopartgroup.cpp
llvosky.cpp
@@ -523,8 +539,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
@@ -564,6 +581,7 @@ set(viewer_HEADER_FILES
ViewerInstall.cmake
llagent.h
llagentaccess.h
+ llagentcamera.h
llagentdata.h
llagentlanguage.h
llagentlistener.h
@@ -571,6 +589,7 @@ set(viewer_HEADER_FILES
llagentpilot.h
llagentui.h
llagentwearables.h
+ llagentwearablesfetch.h
llanimstatelabels.h
llappearance.h
llappearancemgr.h
@@ -587,6 +606,7 @@ set(viewer_HEADER_FILES
llbottomtray.h
llbox.h
llbreadcrumbview.h
+ llbuycurrencyhtml.h
llcallbacklist.h
llcallfloater.h
llcallingcard.h
@@ -602,6 +622,7 @@ set(viewer_HEADER_FILES
llclassifiedinfo.h
llclassifiedstatsresponder.h
llcloud.h
+ llcofwearables.h
llcolorswatch.h
llcommanddispatcherlistener.h
llcommandhandler.h
@@ -641,10 +662,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
@@ -656,10 +677,10 @@ 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
@@ -722,6 +743,7 @@ set(viewer_HEADER_FILES
llfollowcam.h
llfriendcard.h
llgesturemgr.h
+ llgiveinventory.h
llgroupactions.h
llgroupiconctrl.h
llgrouplist.h
@@ -751,7 +773,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
@@ -759,6 +784,7 @@ set(viewer_HEADER_FILES
lllandmarklist.h
lllightconstants.h
lllistbrowser.h
+ lllistcontextmenu.h
lllistview.h
lllocaltextureobject.h
lllocationhistory.h
@@ -789,6 +815,8 @@ set(viewer_HEADER_FILES
llnetmap.h
llnotificationhandler.h
llnotificationmanager.h
+ llnotificationstorage.h
+ lloutfitslist.h
lloutputmonitorctrl.h
llpanelavatar.h
llpanelavatartag.h
@@ -797,6 +825,7 @@ set(viewer_HEADER_FILES
llpanelcontents.h
llpaneleditwearable.h
llpanelface.h
+ llpanelgenerictip.h
llpanelgroup.h
llpanelgroupgeneral.h
llpanelgroupinvite.h
@@ -812,7 +841,6 @@ set(viewer_HEADER_FILES
llpanellandmedia.h
llpanellogin.h
llpanelloginlistener.h
- llpanellookinfo.h
llpanelmaininventory.h
llpanelmediasettingsgeneral.h
llpanelmediasettingspermissions.h
@@ -821,6 +849,8 @@ set(viewer_HEADER_FILES
llpanelnearbymedia.h
llpanelobject.h
llpanelobjectinventory.h
+ llpanelonlinestatus.h
+ llpaneloutfitedit.h
llpaneloutfitsinventory.h
llpanelpeople.h
llpanelpeoplemenus.h
@@ -836,6 +866,7 @@ set(viewer_HEADER_FILES
llpanelprofile.h
llpanelprofileview.h
llpanelteleporthistory.h
+ llpaneltiptoast.h
llpanelvolume.h
llpanelvolumepulldown.h
llparcelselection.h
@@ -866,6 +897,8 @@ set(viewer_HEADER_FILES
llscrollingpanelparam.h
llsearchcombobox.h
llsearchhistory.h
+ llsecapi.h
+ llsechandler_basic.h
llselectmgr.h
llsidepanelappearance.h
llsidepanelinventory.h
@@ -906,7 +939,6 @@ set(viewer_HEADER_FILES
lltexturestats.h
lltexturestatsuploader.h
lltextureview.h
- lltextutil.h
lltoast.h
lltoastalertpanel.h
lltoastgroupnotifypanel.h
@@ -942,7 +974,6 @@ set(viewer_HEADER_FILES
llurldispatcherlistener.h
llurlhistory.h
llurllineeditorctrl.h
- llurlsimstring.h
llurlwhitelist.h
llvectorperfoptions.h
llversioninfo.h
@@ -1007,6 +1038,7 @@ set(viewer_HEADER_FILES
llvoicechannel.h
llvoiceclient.h
llvoicevisualizer.h
+ llvoicevivox.h
llvoinventorylistener.h
llvopartgroup.h
llvosky.h
@@ -1021,8 +1053,9 @@ set(viewer_HEADER_FILES
llwaterparammanager.h
llwaterparamset.h
llwearable.h
- llwearabledictionary.h
+ llwearableitemslist.h
llwearablelist.h
+ llwearabletype.h
llweb.h
llwind.h
llwindebug.h
@@ -1156,6 +1189,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}
@@ -1379,7 +1415,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.
@@ -1397,10 +1433,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
@@ -1434,8 +1470,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
@@ -1475,6 +1509,7 @@ if (WINDOWS)
SLPlugin
media_plugin_quicktime
media_plugin_webkit
+ winmm_shim
windows-crash-logger
windows-updater
)
@@ -1496,7 +1531,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"
)
@@ -1515,8 +1550,6 @@ if (WINDOWS)
add_dependencies(${VIEWER_BINARY_NAME}
SLPlugin
- media_plugin_quicktime
- media_plugin_webkit
windows-updater
windows-crash-logger
)
@@ -1566,7 +1599,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
@@ -1615,6 +1651,8 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${WINDOWS_LIBRARIES}
${XMLRPCEPI_LIBRARIES}
${ELFIO_LIBRARIES}
+ ${OPENSSL_LIBRARIES}
+ ${CRYPTO_LIBRARIES}
${LLLOGIN_LIBRARIES}
${GOOGLE_PERFTOOLS_LIBRARIES}
)
@@ -1791,6 +1829,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)
@@ -1798,6 +1873,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..4831dc7273 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.0.2.0";
+CFBundleGetInfoString = "Second Life version 2.0.2.0, Copyright 2004-2009 Linden Research, Inc.";
diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist
index 38ebb22b84..fa2adac10c 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.0.2.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/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..16e39fc1c4 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>
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 8edf766132..7ed24236b1 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -4,13 +4,14 @@
<key>AFKTimeout</key>
<map>
<key>Comment</key>
- <string>Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never)</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>0</real>
+ <real>300</real>
</map>
<key>AdvanceSnapshot</key>
<map>
@@ -1264,6 +1265,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 +1575,28 @@
<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>CreateToolCopyCenters</key>
<map>
<key>Comment</key>
@@ -1618,6 +1652,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 +1674,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 +2400,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 +2621,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 +2676,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>
@@ -3433,6 +3534,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>FullScreen</key>
+ <map>
+ <key>Comment</key>
+ <string>Run SL in fullscreen mode</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>FullScreenAspectRatio</key>
<map>
<key>Comment</key>
@@ -3477,6 +3589,17 @@
<key>Value</key>
<integer>1024</integer>
</map>
+ <key>GesturesMarketplaceURL</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Gestures 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&amp;CategoryID=233</string>
+ </map>
<key>GridCrossSections</key>
<map>
<key>Comment</key>
@@ -3763,6 +3886,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 +4161,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>
@@ -4391,6 +4536,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 +4613,17 @@
<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>MaxDragDistance</key>
<map>
<key>Comment</key>
@@ -4587,7 +4754,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>MediaShowOutsideParcel</key>
<map>
@@ -5362,6 +5529,17 @@
<key>Value</key>
<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>
<key>Comment</key>
@@ -5540,6 +5718,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>
@@ -5793,7 +5984,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>
@@ -5826,6 +6050,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>
@@ -7663,6 +7898,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>
@@ -7872,32 +8118,32 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>ShowCrosshairs</key>
+ <key>ShowBetaGrids</key>
<map>
<key>Comment</key>
- <string>Display crosshairs when in mouselook mode</string>
+ <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>ShowDebugConsole</key>
+ </map>
+ <key>ShowCrosshairs</key>
<map>
<key>Comment</key>
- <string>Show log in SL window</string>
+ <string>Display crosshairs when in mouselook mode</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
- <key>ShowDebugAppearanceEditor</key>
+ <key>ShowDebugConsole</key>
<map>
<key>Comment</key>
- <string>Show debugging appearance editor</string>
+ <string>Show log in SL window</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -7938,17 +8184,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>ShowCameraButton</key>
- <map>
- <key>Comment</key>
- <string>Show/Hide Camera 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>ShowScriptErrors</key>
<map>
<key>Comment</key>
@@ -7969,34 +8204,23 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>0</integer>
- </map>
- <key>ShowSnapshotButton</key>
- <map>
- <key>Comment</key>
- <string>Show/Hide 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>
</map>
- <key>ShowMoveButton</key>
+ <key>ShowObjectRenderingCost</key>
<map>
<key>Comment</key>
- <string>Show/Hide Move button in the bottom tray</string>
+ <string>Show the object rendering cost in build tools</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
- </map>
- <key>ShowGestureButton</key>
+ </map>
+ <key>ShowNavbarFavoritesPanel</key>
<map>
<key>Comment</key>
- <string>Show/Hide Gesture button in the bottom tray</string>
+ <string>Show/Hide Navigation Bar Favorites Panel</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -8004,21 +8228,10 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>ShowObjectRenderingCost</key>
- <map>
- <key>Comment</key>
- <string>Show the object rendering cost in build tools</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>ShowNavbarFavoritesPanel</key>
+ <key>ShowNavbarNavigationPanel</key>
<map>
<key>Comment</key>
- <string>Show/Hide Navigation Bar Favorites Panel</string>
+ <string>Show/Hide Navigation Bar Navigation Panel</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -8026,16 +8239,16 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>ShowNavbarNavigationPanel</key>
+ <key>SidebarCameraMovement</key>
<map>
<key>Comment</key>
- <string>Show/Hide Navigation Bar Navigation Panel</string>
+ <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>
+ <integer>1</integer>
</map>
<key>GroupListShowIcons</key>
<map>
@@ -8095,13 +8308,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>
@@ -8502,17 +8715,6 @@
<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>ShowVoiceVisualizersInCalls</key>
<map>
<key>Comment</key>
@@ -8524,16 +8726,16 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>ShowVolumeSettingsPopup</key>
+ <key>SidebarWithButtonsVisibility</key>
<map>
<key>Comment</key>
- <string>Show individual volume slider for voice, sound effects, etc</string>
+ <string>Sets visibility of sidebar with its tabs' buttons</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>SkinCurrent</key>
<map>
@@ -8631,17 +8833,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>
@@ -8884,6 +9075,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>
@@ -10171,7 +10373,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>0</integer>
+ </map>
<key>UseStartScreen</key>
<map>
<key>Comment</key>
@@ -10371,6 +10583,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>
@@ -10382,6 +10605,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>
@@ -10514,6 +10759,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>
@@ -10558,6 +10814,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>
@@ -10624,27 +10891,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>
@@ -10655,7 +10933,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>700</integer>
+ <integer>738</integer>
</map>
<key>WindowMaximized</key>
<map>
@@ -10677,7 +10955,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>1000</integer>
+ <integer>1024</integer>
</map>
<key>WindowX</key>
<map>
@@ -10910,5 +11188,66 @@
<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>
</map>
</llsd>
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index af5fa4f388..3ce32a05b0 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -22,17 +22,6 @@
<key>Value</key>
<string>|TOKEN COPY BusyModeResponse|</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,46 @@
<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 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..5efd997ab7 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -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..b4add267fe 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -56,7 +56,7 @@ Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 1.0
RenderShaderLightingMaxLevel 1 3
-
+SkyUseClassicClouds 1 1
//
// Low Graphics Settings
@@ -64,24 +64,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 +298,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..4fb529ab39 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -55,6 +55,7 @@ WLSkyDetail 1 128
Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 1.0
+SkyUseClassicClouds 1 1
//
// Low Graphics Settings
@@ -62,24 +63,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..fbc589d3e7 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -57,6 +57,7 @@ Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 0.5
Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
+SkyUseClassicClouds 1 1
//
// Low Graphics Settings
@@ -64,24 +65,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/gpu_table.txt b/indra/newview/gpu_table.txt
index aa0e21ea8f..5aad295cb1 100644
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -70,43 +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 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 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
@@ -128,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
@@ -204,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
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/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/llagent.cpp b/indra/newview/llagent.cpp
index c5d7f6f118..0fa77ff7c2 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;
}
@@ -985,9 +721,9 @@ void LLAgent::sendReliableMessage()
//-----------------------------------------------------------------------------
LLVector3 LLAgent::getVelocity() const
{
- if (mAvatarObject.notNull())
+ if (isAgentAvatarValid())
{
- return mAvatarObject->getVelocity();
+ return gAgentAvatarp->getVelocity();
}
else
{
@@ -1006,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);
@@ -1029,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
{
@@ -1061,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();
@@ -1189,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();
}
}
@@ -1239,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;
}
@@ -1292,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;
}
@@ -2117,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);
@@ -2181,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;
}
@@ -2227,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;
@@ -2242,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;
@@ -2296,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)
{
@@ -2303,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())
@@ -2342,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);
}
@@ -2423,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)
@@ -2490,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"))
{
@@ -2522,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();
}
//-----------------------------------------------------------------------------
@@ -2546,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
@@ -2633,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.
//-----------------------------------------------------------------------------
@@ -2678,7 +1565,7 @@ void LLAgent::setAvatarObject(LLVOAvatarSelf *avatar)
//-----------------------------------------------------------------------------
BOOL LLAgent::needsRenderAvatar()
{
- if (cameraMouselook() && !LLVOAvatar::sVisibleInFirstPerson)
+ if (gAgentCamera.cameraMouselook() && !LLVOAvatar::sVisibleInFirstPerson)
{
return FALSE;
}
@@ -2689,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());
}
//-----------------------------------------------------------------------------
@@ -2711,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);
}
}
@@ -2790,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();
@@ -2835,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);
@@ -2869,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
@@ -2881,7 +1767,7 @@ void LLAgent::endAnimationUpdateUI()
gMorphView->setVisible( FALSE );
}
- if (mAvatarObject.notNull())
+ if (isAgentAvatarValid())
{
if(mCustomAnim)
{
@@ -2892,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);
@@ -2913,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);
@@ -2941,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);
@@ -2993,1588 +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()
-{
- 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 (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;
- 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 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();
}
//-----------------------------------------------------------------------------
@@ -4592,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)
@@ -4720,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 );
@@ -4830,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)
@@ -5029,9 +2272,9 @@ void LLAgent::buildFullnameAndTitle(std::string& name) const
name.erase(0, name.length());
}
- if (mAvatarObject.notNull())
+ if (isAgentAvatarValid())
{
- name += mAvatarObject->getFullname();
+ name += gAgentAvatarp->getFullname();
}
}
@@ -5177,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
@@ -5193,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;
@@ -5353,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
@@ -5817,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;
@@ -5845,33 +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 ((S32)texture_index < BAKED_NUM_INDICES
- && gAgentQueryManager.mActiveCacheQueries[texture_index] == query_id)
- {
- if (texture_id.notNull())
- {
- //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++;
- }
- else
+
+ if ((S32)texture_index < TEX_NUM_INDICES )
+ {
+ const LLVOAvatarDictionary::TextureEntry *texture_entry = LLVOAvatarDictionary::instance().getTexture((ETextureIndex)texture_index);
+ if (texture_entry)
{
- // no cache of this bake. request upload.
- avatarp->requestLayerSetUpload((EBakedTextureIndex)texture_index);
+ 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();
}
}
@@ -5924,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();
}
}
@@ -5952,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
@@ -5969,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");
@@ -5981,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);
@@ -5997,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;
}
@@ -6141,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)
{
@@ -6154,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 ==
@@ -6173,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);
}
@@ -6280,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;
@@ -6302,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
@@ -6312,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;
@@ -6338,32 +3585,18 @@ 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++)
- {
- // 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();
- }
- }
+ LLUUID hash = gAgentWearables.computeBakedTextureHash((EBakedTextureIndex) baked_index);
+
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
{
@@ -6376,9 +3609,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)
{
@@ -6500,7 +3733,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 f2df1992e7..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
**/
@@ -938,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;
@@ -954,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
** **
*******************************************************************************/
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
new file mode 100644
index 0000000000..47f290ad3b
--- /dev/null
+++ b/indra/newview/llagentcamera.cpp
@@ -0,0 +1,2849 @@
+/**
+ * @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.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");
+
+ 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 = mFocusOffsetInitial[mCameraPreset] * agent_rot;
+ return focus_offset;
+}
+
+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 mCameraOffsetInitial[mCameraPreset];
+}
+
+
+//-----------------------------------------------------------------------------
+// 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();
+
+ // 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();
+ }
+
+ // Remove any pitch from the avatar
+ //LLVector3 at = gAgent.getFrameAgent().getAtAxis();
+ //at.mV[VZ] = 0.f;
+ //at.normalize();
+ //gAgent.resetAxes(at);
+
+ 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)
+ {
+ // Remove any pitch from the avatar
+ LLVector3 at = gAgent.getFrameAgent().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");
+ }
+ }
+ setFocusGlobal(LLVector3d::zero);
+ }
+ 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..5cbb1de6f4
--- /dev/null
+++ b/indra/newview/llagentcamera.h
@@ -0,0 +1,400 @@
+/**
+ * @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;
+
+//--------------------------------------------------------------------
+// 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, 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(); }
+ 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 72ab9235cf..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
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 6ab1361dd1..cc9e68d593 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -31,104 +31,33 @@
*/
#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 "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
-
-//--------------------------------------------------------------------
-// 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();
-};
-
-class LLLibraryOutfitsFetch : public LLInventoryFetchDescendentsObserver
-{
-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<LLUUID> clothing_folder_vec_t;
- clothing_folder_vec_t mLibraryClothingFolders;
- clothing_folder_vec_t mImportedClothingFolders;
- bool mOutfitsPopulated;
- LLUUID mClothingID;
- LLUUID mLibraryClothingID;
- LLUUID mImportedClothingID;
- std::string mImportedClothingName;
-};
-
LLAgentWearables gAgentWearables;
BOOL LLAgentWearables::mInitialWearablesUpdateReceived = FALSE;
@@ -171,13 +100,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 +125,6 @@ void LLAgentWearables::dump()
}
}
-// MULTI-WEARABLE: debugging
struct LLAgentDumper
{
LLAgentDumper(std::string name):
@@ -218,8 +146,7 @@ struct LLAgentDumper
};
LLAgentWearables::LLAgentWearables() :
- mWearablesLoaded(FALSE),
- mAvatarObject(NULL)
+ mWearablesLoaded(FALSE)
{
}
@@ -230,12 +157,10 @@ LLAgentWearables::~LLAgentWearables()
void LLAgentWearables::cleanup()
{
- mAvatarObject = NULL;
}
void LLAgentWearables::setAvatarObject(LLVOAvatarSelf *avatar)
{
- mAvatarObject = avatar;
if (avatar)
{
sendAgentWearablesRequest();
@@ -265,7 +190,7 @@ 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),
@@ -293,7 +218,7 @@ void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& i
}
if (mTodo & CALL_RECOVERDONE)
{
- LLAppearanceManager::instance().addCOFItemLink(inv_item,false);
+ LLAppearanceMgr::instance().addCOFItemLink(inv_item,false);
gAgentWearables.recoverMissingWearableDone();
}
/*
@@ -301,7 +226,7 @@ void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& i
*/
if (mTodo & CALL_CREATESTANDARDDONE)
{
- LLAppearanceManager::instance().addCOFItemLink(inv_item,false);
+ LLAppearanceMgr::instance().addCOFItemLink(inv_item,false);
gAgentWearables.createStandardWearablesDone(mType, mIndex);
}
if (mTodo & CALL_MAKENEWOUTFITDONE)
@@ -310,11 +235,11 @@ void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& i
}
if (mTodo & CALL_WEARITEM)
{
- LLAppearanceManager::instance().addCOFItemLink(inv_item, true);
+ 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)
@@ -324,7 +249,7 @@ void LLAgentWearables::addWearabletoAgentInventoryDone(const S32 type,
if (item_id.isNull())
return;
- LLUUID old_item_id = getWearableItemID((EWearableType)type,index);
+ LLUUID old_item_id = getWearableItemID(type,index);
if (wearable)
{
@@ -333,11 +258,11 @@ void LLAgentWearables::addWearabletoAgentInventoryDone(const S32 type,
if (old_item_id.notNull())
{
gInventory.addChangedMask(LLInventoryObserver::LABEL, old_item_id);
- setWearable((EWearableType)type,index,wearable);
+ setWearable(type,index,wearable);
}
else
{
- pushWearable((EWearableType)type,wearable);
+ pushWearable(type,wearable);
}
}
@@ -359,13 +284,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())
@@ -373,8 +297,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);
@@ -399,16 +323,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;
@@ -424,16 +347,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()))
@@ -443,6 +366,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)
{
@@ -474,7 +402,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);
@@ -482,7 +410,7 @@ void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, B
return;
}
- gAgent.getAvatarObject()->wearableUpdated( type, TRUE );
+ gAgentAvatarp->wearableUpdated( type, TRUE );
if (send_update)
{
@@ -491,7 +419,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)
@@ -545,9 +473,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();
@@ -562,10 +495,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();
}
@@ -573,14 +506,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();
@@ -594,7 +527,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;
}
@@ -603,12 +536,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()))
{
@@ -618,7 +557,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())
@@ -634,7 +573,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())
@@ -649,7 +588,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;
@@ -662,12 +601,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;
}
@@ -678,11 +635,11 @@ const LLWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id)
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++)
{
- 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;
@@ -702,12 +659,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())
@@ -725,7 +682,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);
@@ -755,7 +712,7 @@ 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)
{
@@ -763,7 +720,7 @@ U32 LLAgentWearables::pushWearable(const EWearableType type, LLWearable *wearabl
llwarns << "Null wearable sent for type " << type << llendl;
return MAX_WEARABLES_PER_TYPE;
}
- if (type < WT_COUNT || mWearableDatas[type].size() < MAX_WEARABLES_PER_TYPE)
+ if (type < LLWearableType::WT_COUNT || mWearableDatas[type].size() < MAX_WEARABLES_PER_TYPE)
{
mWearableDatas[type].push_back(wearable);
wearableUpdated(wearable);
@@ -775,7 +732,7 @@ U32 LLAgentWearables::pushWearable(const EWearableType type, LLWearable *wearabl
void LLAgentWearables::wearableUpdated(LLWearable *wearable)
{
- mAvatarObject->wearableUpdated(wearable->getType(), TRUE);
+ gAgentAvatarp->wearableUpdated(wearable->getType(), TRUE);
wearable->refreshName();
wearable->setLabelUpdated();
@@ -805,7 +762,7 @@ 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))
{
@@ -813,13 +770,13 @@ void LLAgentWearables::popWearable(LLWearable *wearable)
}
}
-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(), TRUE);
wearable->setLabelUpdated();
}
}
@@ -831,7 +788,7 @@ U32 LLAgentWearables::getWearableIndex(LLWearable *wearable)
return MAX_WEARABLES_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())
{
@@ -850,7 +807,7 @@ U32 LLAgentWearables::getWearableIndex(LLWearable *wearable)
return MAX_WEARABLES_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())
@@ -868,7 +825,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)
@@ -879,7 +836,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())
@@ -892,7 +859,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);
}
@@ -907,7 +874,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)
@@ -916,7 +883,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)
@@ -927,15 +894,10 @@ 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
@@ -951,8 +913,7 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
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);
@@ -970,23 +931,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);
@@ -999,29 +959,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();
@@ -1036,75 +993,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);
@@ -1115,7 +1013,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);
@@ -1138,9 +1036,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;
@@ -1154,7 +1052,7 @@ class OnWearableItemCreatedCB: public LLInventoryCallback
{
public:
OnWearableItemCreatedCB():
- mWearablesAwaitingItems(WT_COUNT,NULL)
+ mWearablesAwaitingItems(LLWearableType::WT_COUNT,NULL)
{
llinfos << "created callback" << llendl;
}
@@ -1169,7 +1067,7 @@ public:
{
llinfos << "All items created" << llendl;
LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;
- LLAppearanceManager::instance().linkAll(LLAppearanceManager::instance().getCOF(),
+ LLAppearanceMgr::instance().linkAll(LLAppearanceMgr::instance().getCOF(),
mItemsToLink,
link_waiter);
}
@@ -1180,8 +1078,8 @@ public:
llwarns << "no wearable" << llendl;
return;
}
- EWearableType type = wearable->getType();
- if (type<WT_COUNT)
+ LLWearableType::EType type = wearable->getType();
+ if (type<LLWearableType::WT_COUNT)
{
mWearablesAwaitingItems[type] = wearable;
}
@@ -1205,8 +1103,8 @@ public:
}
if (item && item->isWearableType())
{
- EWearableType type = item->getWearableType();
- if (type < WT_COUNT)
+ LLWearableType::EType type = item->getWearableType();
+ if (type < LLWearableType::WT_COUNT)
{
LLWearable *wearable = mWearablesAwaitingItems[type];
if (wearable)
@@ -1229,37 +1127,34 @@ void LLAgentWearables::createStandardWearables(BOOL female)
llwarns << "Creating Standard " << (female ? "female" : "male")
<< " Wearables" << llendl;
- if (mAvatarObject.isNull())
- {
- return;
- }
-
- mAvatarObject->setSex(female ? SEX_FEMALE : SEX_MALE);
-
- const BOOL create[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
+ if (!isAgentAvatarValid()) return;
+
+ gAgentAvatarp->setSex(female ? SEX_FEMALE : SEX_MALE);
+
+ const BOOL create[LLWearableType::WT_COUNT] =
+ {
+ 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
};
LLPointer<LLInventoryCallback> cb = new OnWearableItemCreatedCB;
- for (S32 i=0; i < WT_COUNT; i++)
+ for (S32 i=0; i < LLWearableType::WT_COUNT; i++)
{
if (create[i])
{
- llassert(getWearableCount((EWearableType)i) == 0);
- LLWearable* wearable = LLWearableList::instance().createNewWearable((EWearableType)i);
+ llassert(getWearableCount((LLWearableType::EType)i) == 0);
+ LLWearable* wearable = LLWearableList::instance().createNewWearable((LLWearableType::EType)i);
((OnWearableItemCreatedCB*)(&(*cb)))->addPendingWearable(wearable);
// no need to update here...
LLUUID category_id = LLUUID::null;
@@ -1281,10 +1176,9 @@ void LLAgentWearables::createStandardWearables(BOOL female)
void LLAgentWearables::createStandardWearablesDone(S32 type, U32 index)
{
llinfos << "type " << type << " index " << index << llendl;
- if (mAvatarObject)
- {
- mAvatarObject->updateVisualParams();
- }
+
+ if (!isAgentAvatarValid()) return;
+ gAgentAvatarp->updateVisualParams();
}
void LLAgentWearables::createStandardWearablesAllDone()
@@ -1295,168 +1189,14 @@ void LLAgentWearables::createStandardWearablesAllDone()
mWearablesLoaded = TRUE;
checkWearablesLoaded();
+ mLoadedSignal();
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);
- llassert(item);
- if (item)
- {
- 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
{
@@ -1472,7 +1212,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);
@@ -1483,8 +1224,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&)
@@ -1495,30 +1236,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().shallowCopyCategoryContents(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())
{
@@ -1549,10 +1269,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
@@ -1578,6 +1298,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;
@@ -1591,22 +1312,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"
@@ -1620,7 +1340,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)
@@ -1658,30 +1378,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)
{
llinfos << "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;
-
+ // 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);
@@ -1695,77 +1410,38 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
llassert(new_wearable);
if (new_wearable)
{
- const EWearableType type = new_wearable->getType();
- wearables_to_remove[type] = FALSE;
+ const LLWearableType::EType type = new_wearable->getType();
+
+ new_wearable->setName(new_item->getName());
+ new_wearable->setItemID(new_item->getUUID());
- // MULTI_WEARABLE: using 0th
- LLWearable* old_wearable = getWearable(type, 0);
- if (old_wearable)
+ if (LLWearableType::getAssetType(type) == LLAssetType::AT_BODYPART)
{
- 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;
- }
-
- // Assumes existing wearables are not dirty.
- if (old_wearable->isDirty())
- {
- llassert(0);
- continue;
- }
+ // exactly one wearable per body part
+ setWearable(type,0,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)
+ if (isAgentAvatarValid())
{
- LLWearable* wearablep = *wearable_iter;
- if (wearablep)
- {
- wearablep->removeFromAvatar(TRUE);
- }
- }
-
- if (mAvatarObject)
- {
- mAvatarObject->updateVisualParams();
- mAvatarObject->invalidateAll();
+ gAgentAvatarp->setCompositeUpdatesEnabled(TRUE);
+ gAgentAvatarp->updateVisualParams();
+ gAgentAvatarp->invalidateAll();
}
// Start rendering & update the server
mWearablesLoaded = TRUE;
checkWearablesLoaded();
+ mLoadedSignal();
queryWearableCache();
updateServer();
@@ -1783,7 +1459,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)
{
@@ -1796,7 +1472,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;
}
@@ -1819,6 +1495,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;
@@ -1828,8 +1505,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;
@@ -1853,7 +1529,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())
{
@@ -1918,32 +1594,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++)
- {
- 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())
+ LLUUID hash_id = computeBakedTextureHash((EBakedTextureIndex) baked_index);
+ if (hash_id.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;
@@ -1955,16 +1617,57 @@ void LLAgentWearables::queryWearableCache()
gAgentQueryManager.mWearablesCacheQueryID++;
}
-// MULTI_WEARABLE: need a way to specify by wearable rather than by type.
+LLUUID LLAgentWearables::computeBakedTextureHash(LLVOAvatarDefines::EBakedTextureIndex index)
+{
+ LLUUID hash_id;
+ bool hash_computed = false;
+ LLMD5 hash;
+
+ const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture(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);
+ 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==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,false,index);
+ }
+}
+
+//static
+void LLAgentWearables::userRemoveWearablesOfType(const LLWearableType::EType &type)
{
- 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,true,0);
}
}
@@ -1972,14 +1675,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
@@ -1987,17 +1688,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);
}
}
@@ -2010,12 +1711,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;
@@ -2024,8 +1720,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;
@@ -2081,12 +1777,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;
@@ -2109,17 +1800,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;
@@ -2175,7 +1861,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());
@@ -2199,531 +1889,132 @@ 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)
+ {
+ mLoadedSignal();
+ }
}
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)
-{
- llinfos << "starting outfit population" << llendl;
-
- 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);
-
- folders.push_back(outfits->mMyOutfitsID);
- gInventory.addObserver(outfits);
- outfits->fetchDescendents(folders);
- if (outfits->isEverythingComplete())
- {
- outfits->done();
- }
-}
+ wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(item->getWearableType());
+ if (wearable_iter == mWearableDatas.end()) 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.
-}
-
-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(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);
+ wearableentry_vec_t& wearable_vec = wearable_iter->second;
+ if (wearable_vec.empty()) return false;
- // If Library->Clothing->Initial Outfits exists, use that.
- LLNameCategoryCollector matchFolderFunctor("Initial Outfits");
- 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();
- }
+ const LLUUID& asset_id = item->getAssetUUID();
- 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();
- }
-}
+ //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;
-void LLLibraryOutfitsFetch::outfitsDone(void)
-{
- 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)
+ for (U32 i = 0; i < wearable_vec.size(); ++i)
{
- const LLViewerInventoryCategory *cat = iter->get();
+ LLWearable* wearable = wearable_vec[i];
+ if (!wearable) continue;
+ if (wearable->getAssetID() != asset_id) continue;
- // 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());
- }
+ //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;
}
- 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();
- }
-
- mCompleteFolders.clear();
-
- fetchDescendents(folders);
- if (isEverythingComplete())
- {
- done();
- }
+ return false;
}
-class LLLibraryOutfitsCopyDone: public LLInventoryCallback
+// static
+void LLAgentWearables::editWearable(const LLUUID& item_id)
{
-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;
-};
+ LLViewerInventoryItem* item;
+ LLWearable* wearable;
-// Copy the clothing folders from the library into the imported clothing folder
-void LLLibraryOutfitsFetch::libraryDone(void)
-{
- if (mImportedClothingID != LLUUID::null)
+ if ((item = gInventory.getLinkedItem(item_id)) &&
+ (wearable = gAgentWearables.getWearableFromAssetID(item->getAssetUUID())) &&
+ gAgentWearables.isWearableModifiable(item->getUUID()) &&
+ item->isFinished())
{
- // 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 (clothing_folder_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 (!LLAppearanceManager::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());
- LLAppearanceManager::getInstance()->shallowCopyCategoryContents(src_folder_id, dst_folder_id, copy_waiter);
+ LLPanel* panel = LLSideTray::getInstance()->showPanel("panel_outfit_edit", LLSD());
+ // copied from LLPanelOutfitEdit::onEditWearableClicked()
+ LLSidepanelAppearance::editWearable(wearable, panel->getParent());
}
}
-void LLLibraryOutfitsFetch::importedFolderFetch(void)
+void LLAgentWearables::updateServer()
{
- // Fetch the contents of the Imported Clothing Folder
- LLInventoryFetchDescendentsObserver::folder_ref_t folders;
- folders.push_back(mImportedClothingID);
-
- mCompleteFolders.clear();
-
- fetchDescendents(folders);
- if (isEverythingComplete())
- {
- done();
- }
+ sendAgentWearablesUpdate();
+ gAgent.sendAgentSetAppearance();
}
-void LLLibraryOutfitsFetch::importedFolderDone(void)
-{
- 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(cat->getUUID());
- }
-
- mCompleteFolders.clear();
- fetchDescendents(folders);
- if (isEverythingComplete())
- {
- done();
- }
-}
+void LLAgentWearables::populateMyOutfitsFolder(void)
+{
+ llinfos << "starting outfit population" << llendl;
-void LLLibraryOutfitsFetch::contentsDone(void)
-{
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t wearable_array;
+ const LLUUID& my_outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ LLLibraryOutfitsFetch* outfits = new LLLibraryOutfitsFetch(my_outfits_id);
+ outfits->mMyOutfitsID = my_outfits_id;
- for (clothing_folder_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;
- }
-
- // 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(),
- LLAssetType::AT_LINK,
- NULL);
- }
- }
-
- 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()
-{
-}
-
-// 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);
- doOnIdle(boost::bind(&LLInitialWearablesFetch::processContents,this));
-}
-
-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(mCompleteFolders.front(), cat_array, wearable_array,
- LLInventoryModel::EXCLUDE_TRASH, is_wearable);
-
- LLAppearanceManager::instance().setAttachmentInvLinkEnable(true);
- if (wearable_array.count() > 0)
- {
- LLAppearanceManager::instance().updateAppearanceFromCOF();
- }
- else
+ // 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())
{
- // if we're constructing the COF from the wearables message, we don't have a proper outfit link
- LLAppearanceManager::instance().setOutfitDirty(true);
- processWearablesMessage();
+ outfits->done();
}
- delete this;
}
-class LLFetchAndLinkObserver: public LLInventoryFetchObserver
-{
-public:
- LLFetchAndLinkObserver(LLInventoryFetchObserver::item_ref_t& ids):
- m_ids(ids),
- LLInventoryFetchObserver(true) // retry for missing items
- {
- }
- ~LLFetchAndLinkObserver()
- {
- }
- virtual void done()
- {
- gInventory.removeObserver(this);
-
- // Link to all fetched items in COF.
- LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;
- 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,
- link_waiter);
- }
- }
-private:
- LLInventoryFetchObserver::item_ref_t m_ids;
-};
-
-void LLInitialWearablesFetch::processWearablesMessage()
+boost::signals2::connection LLAgentWearables::addLoadedCallback(loaded_callback_t cb)
{
- 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
-#if 0
-// // Fetch the wearables
-// LLWearableList::instance().getAsset(wearable_data->mAssetID,
-// LLStringUtil::null,
-// LLWearableDictionary::getAssetType(wearable_data->mType),
-// LLAgentWearables::onInitialWearableAssetArrived, (void*)(wearable_data));
-#endif
- }
- 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;
- }
+ return mLoadedSignal.connect(cb);
}
-
-
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index a6b73997a6..c53b1333fc 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -62,7 +62,6 @@ public:
void cleanup();
void dump();
protected:
- // MULTI-WEARABLE: assuming one per type. Type is called index - rename.
void createStandardWearablesDone(S32 type, U32 index/* = 0*/);
void createStandardWearablesAllDone();
@@ -71,32 +70,36 @@ 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;
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;
+ LLWearable* getWearableFromItemID(const LLUUID& item_id);
LLWearable* getWearableFromAssetID(const LLUUID& asset_id);
- 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;
+ 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;
//--------------------------------------------------------------------
@@ -105,17 +108,17 @@ public:
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 +129,28 @@ 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 editWearable(const LLUUID& item_id);
+ bool moveWearable(const LLViewerInventoryItem* item, bool closer_to_body);
+
+ //--------------------------------------------------------------------
// 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 +161,8 @@ 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 index);
+
protected:
void sendAgentWearablesUpdate();
void sendAgentWearablesRequest();
@@ -161,20 +174,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 +186,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 +210,27 @@ public:
U32 itemUpdatePendingCount() const;
//--------------------------------------------------------------------
+ // Signals
+ //--------------------------------------------------------------------
+public:
+ typedef boost::function<void()> loaded_callback_t;
+ typedef boost::signals2::signal<void()> loaded_signal_t;
+ boost::signals2::connection addLoadedCallback(loaded_callback_t cb);
+
+private:
+ 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
//--------------------------------------------------------------------------------
// Support classes
@@ -238,7 +250,7 @@ private:
class addWearableToAgentInventoryCallback : public LLInventoryCallback
{
public:
- enum EType
+ enum ETodo
{
CALL_NONE = 0,
CALL_UPDATE = 1,
@@ -248,16 +260,14 @@ private:
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;
diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp
new file mode 100644
index 0000000000..43a0d48d8b
--- /dev/null
+++ b/indra/newview/llagentwearablesfetch.cpp
@@ -0,0 +1,527 @@
+/**
+ * @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"
+
+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)
+ {
+ 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;
+
+ 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,
+ NULL);
+ }
+ }
+
+ 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 f686eccf37..8cc4436188 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -32,23 +32,49 @@
#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 "llgesturemgr.h"
#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
#include "llinventoryobserver.h"
#include "llnotificationsutil.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"
-LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string& name)
+char ORDER_NUMBER_SEPARATOR('@');
+
+// support for secondlife:///app/appearance SLapps
+class LLAppearanceHandler : public LLCommandHandler
+{
+public:
+ // requests will be throttled from a non-trusted browser
+ LLAppearanceHandler() : LLCommandHandler("appearance", UNTRUSTED_THROTTLE) {}
+
+ bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ {
+ // support secondlife:///app/appearance/show, but for now we just
+ // make all secondlife:///app/appearance SLapps behave this way
+ LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD());
+ 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;
@@ -73,23 +99,6 @@ LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string&
}
}
-// support for secondlife:///app/appearance SLapps
-class LLAppearanceHandler : public LLCommandHandler
-{
-public:
- // requests will be throttled from a non-trusted browser
- LLAppearanceHandler() : LLCommandHandler("appearance", UNTRUSTED_THROTTLE) {}
-
- bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
- {
- // support secondlife:///app/appearance/show, but for now we just
- // make all secondlife:///app/appearance SLapps behave this way
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD());
- return true;
- }
-};
-LLAppearanceHandler gAppearanceHandler;
-
class LLWearInventoryCategoryCallback : public LLInventoryCallback
{
public:
@@ -119,7 +128,7 @@ protected:
// 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
{
@@ -132,174 +141,16 @@ 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()
-{
- llinfos << "done 2nd stage fetch" << llendl;
- gInventory.removeObserver(this);
- doOnIdle(boost::bind(&LLOutfitObserver::doWearCategory,this));
-}
-
-void LLOutfitObserver::doWearCategory()
-{
- llinfos << "starting" << llendl;
-
- // We now have an outfit ready to be copied to agent inventory. Do
- // it, and wear that outfit normally.
- if(mCopyItems)
- {
- 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)
- {
- item = (LLViewerInventoryItem*)gInventory.getItem(*it);
- if(item)
- {
- copy_inventory_item(
- gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- cat_id,
- std::string(),
- cb);
- }
- }
- // 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
+//Inventory callback updating "dirty" state when destroyed
+class LLUpdateDirtyState: public LLInventoryCallback
{
public:
- LLOutfitFetch(bool copy_items, bool append) : mCopyItems(copy_items), mAppend(append) {}
- ~LLOutfitFetch() {}
- virtual void done();
-protected:
- bool mCopyItems;
- bool mAppend;
+ LLUpdateDirtyState() {}
+ virtual ~LLUpdateDirtyState(){ LLAppearanceMgr::getInstance()->updateIsDirty(); }
+ 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.
- llinfos << "done first stage fetch" << llendl;
-
- 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)
@@ -312,13 +163,15 @@ LLUpdateAppearanceOnDestroy::~LLUpdateAppearanceOnDestroy()
if (!LLApp::isExiting())
{
- LLAppearanceManager::instance().updateAppearanceFromCOF();
+ LLAppearanceMgr::instance().updateAppearanceFromCOF();
}
}
void LLUpdateAppearanceOnDestroy::fire(const LLUUID& inv_item)
{
- llinfos << "callback fired" << llendl;
+ LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(inv_item);
+ const std::string item_name = item ? item->getName() : "ITEM NOT FOUND";
+ llinfos << "callback fired [ name:" << item_name << " UUID:" << inv_item << " count:" << mFireCount << " ] " << llendl;
mFireCount++;
}
@@ -326,14 +179,14 @@ struct LLFoundData
{
LLFoundData() :
mAssetType(LLAssetType::AT_NONE),
- mWearableType(WT_INVALID),
+ mWearableType(LLWearableType::WT_INVALID),
mWearable(NULL) {}
LLFoundData(const LLUUID& item_id,
const LLUUID& asset_id,
const std::string& name,
const LLAssetType::EType& asset_type,
- const EWearableType& wearable_type
+ const LLWearableType::EType& wearable_type
) :
mItemID(item_id),
mAssetID(asset_id),
@@ -346,7 +199,7 @@ struct LLFoundData
LLUUID mAssetID;
std::string mName;
LLAssetType::EType mAssetType;
- EWearableType mWearableType;
+ LLWearableType::EType mWearableType;
LLWearable* mWearable;
};
@@ -365,9 +218,10 @@ public:
void checkMissingWearables();
bool pollMissingWearables();
bool isMissingCompleted();
- void recoverMissingWearable(EWearableType type);
+ void recoverMissingWearable(LLWearableType::EType type);
void clearCOFLinksForMissingWearables();
+ void onWearableAssetFetch(LLWearable *wearable);
void onAllComplete();
typedef std::list<LLFoundData> found_list_t;
@@ -399,24 +253,24 @@ bool LLWearableHoldingPattern::isFetchCompleted()
bool LLWearableHoldingPattern::isTimedOut()
{
- static F32 max_wait_time = 20.0; // give up if wearable fetches haven't completed in max_wait_time seconds.
+ static F32 max_wait_time = 60.0; // give up if wearable fetches haven't completed in max_wait_time seconds.
return mWaitTime.getElapsedTimeF32() > max_wait_time;
}
void LLWearableHoldingPattern::checkMissingWearables()
{
- std::vector<S32> found_by_type(WT_COUNT,0);
- std::vector<S32> requested_by_type(WT_COUNT,0);
+ 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 = mFoundList.begin(); it != mFoundList.end(); ++it)
{
LLFoundData &data = *it;
- if (data.mWearableType < WT_COUNT)
+ if (data.mWearableType < LLWearableType::WT_COUNT)
requested_by_type[data.mWearableType]++;
if (data.mWearable)
found_by_type[data.mWearableType]++;
}
- for (S32 type = 0; type < WT_COUNT; ++type)
+ 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)
@@ -427,18 +281,18 @@ void LLWearableHoldingPattern::checkMissingWearables()
// pants)
(requested_by_type[type] > 0) ||
// or if type is a body part and no wearables were found.
- ((type == WT_SHAPE) || (type == WT_SKIN) || (type == WT_HAIR) || (type == WT_EYES)))
+ ((type == LLWearableType::WT_SHAPE) || (type == LLWearableType::WT_SKIN) || (type == LLWearableType::WT_HAIR) || (type == LLWearableType::WT_EYES)))
{
mTypesToRecover.insert(type);
mTypesToLink.insert(type);
- recoverMissingWearable((EWearableType)type);
+ recoverMissingWearable((LLWearableType::EType)type);
llwarns << "need to replace " << type << llendl;
}
}
+ mWaitTime.reset();
if (!pollMissingWearables())
{
- mWaitTime.reset();
doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollMissingWearables,this));
}
}
@@ -450,12 +304,12 @@ void LLWearableHoldingPattern::onAllComplete()
{
llinfos << "Activating " << mGestItems.count() << " gestures" << llendl;
- LLGestureManager::instance().activateGestures(mGestItems);
+ LLGestureMgr::instance().activateGestures(mGestItems);
// Update the inventory item labels to reflect the fact
// they are active.
LLViewerInventoryCategory* catp =
- gInventory.getCategory(LLAppearanceManager::instance().getCOF());
+ gInventory.getCategory(LLAppearanceMgr::instance().getCOF());
if (catp)
{
@@ -466,11 +320,10 @@ void LLWearableHoldingPattern::onAllComplete()
// Update wearables.
llinfos << "Updating agent wearables with " << mResolved << " wearable items " << llendl;
- LLAppearanceManager::instance().updateAgentWearables(this, false);
+ LLAppearanceMgr::instance().updateAgentWearables(this, false);
// Update attachments to match those requested.
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- if( avatar )
+ if (isAgentAvatarValid())
{
llinfos << "Updating " << mObjItems.count() << " attachments" << llendl;
LLAgentWearables::userUpdateAttachments(mObjItems);
@@ -515,7 +368,7 @@ bool LLWearableHoldingPattern::pollFetchCompletion()
class RecoveredItemLinkCB: public LLInventoryCallback
{
public:
- RecoveredItemLinkCB(EWearableType type, LLWearable *wearable, LLWearableHoldingPattern* holder):
+ RecoveredItemLinkCB(LLWearableType::EType type, LLWearable *wearable, LLWearableHoldingPattern* holder):
mHolder(holder),
mWearable(wearable),
mType(type)
@@ -539,7 +392,7 @@ public:
linked_item->getAssetUUID(),
linked_item->getName(),
linked_item->getType(),
- linked_item->isWearableType() ? linked_item->getWearableType() : WT_INVALID
+ linked_item->isWearableType() ? linked_item->getWearableType() : LLWearableType::WT_INVALID
);
found.mWearable = mWearable;
mHolder->mFoundList.push_front(found);
@@ -557,13 +410,13 @@ public:
private:
LLWearableHoldingPattern* mHolder;
LLWearable *mWearable;
- EWearableType mType;
+ LLWearableType::EType mType;
};
class RecoveredItemCB: public LLInventoryCallback
{
public:
- RecoveredItemCB(EWearableType type, LLWearable *wearable, LLWearableHoldingPattern* holder):
+ RecoveredItemCB(LLWearableType::EType type, LLWearable *wearable, LLWearableHoldingPattern* holder):
mHolder(holder),
mWearable(wearable),
mType(type)
@@ -581,8 +434,9 @@ public:
{
link_inventory_item( gAgent.getID(),
item_id,
- LLAppearanceManager::instance().getCOF(),
+ LLAppearanceMgr::instance().getCOF(),
itemp->getName(),
+ itemp->getDescription(),
LLAssetType::AT_LINK,
cb);
}
@@ -590,14 +444,14 @@ public:
private:
LLWearableHoldingPattern* mHolder;
LLWearable *mWearable;
- EWearableType mType;
+ LLWearableType::EType mType;
};
-void LLWearableHoldingPattern::recoverMissingWearable(EWearableType type)
+void LLWearableHoldingPattern::recoverMissingWearable(LLWearableType::EType type)
{
// Try to recover by replacing missing wearable with a new one.
LLNotificationsUtil::add("ReplacedMissingWearable");
- lldebugs << "Wearable " << LLWearableDictionary::getTypeLabel(type)
+ lldebugs << "Wearable " << LLWearableType::getTypeLabel(type)
<< " could not be downloaded. Replaced inventory item with default wearable." << llendl;
LLWearable* wearable = LLWearableList::instance().createNewWearable(type);
@@ -628,11 +482,11 @@ void LLWearableHoldingPattern::clearCOFLinksForMissingWearables()
for (found_list_t::iterator it = mFoundList.begin(); it != mFoundList.end(); ++it)
{
LLFoundData &data = *it;
- if ((data.mWearableType < WT_COUNT) && (!data.mWearable))
+ 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;
- LLAppearanceManager::instance().removeCOFItemLinks(data.mItemID,false);
+ LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID,false);
}
}
}
@@ -651,17 +505,17 @@ bool LLWearableHoldingPattern::pollMissingWearables()
if (done)
{
+ gAgentAvatarp->debugWearablesLoaded();
clearCOFLinksForMissingWearables();
onAllComplete();
}
return done;
}
-static void onWearableAssetFetch(LLWearable* wearable, void* data)
+void LLWearableHoldingPattern::onWearableAssetFetch(LLWearable *wearable)
{
- LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data;
- holder->mResolved += 1; // just counting callbacks, not successes.
- llinfos << "onWearableAssetFetch, resolved count " << holder->mResolved << " of requested " << holder->mFoundList.size() << llendl;
+ mResolved += 1; // just counting callbacks, not successes.
+ llinfos << "onWearableAssetFetch, resolved count " << mResolved << " of requested " << mFoundList.size() << llendl;
if (wearable)
{
llinfos << "wearable found, type " << wearable->getType() << " asset " << wearable->getAssetID() << llendl;
@@ -671,7 +525,7 @@ static void onWearableAssetFetch(LLWearable* wearable, void* data)
llwarns << "no wearable found" << llendl;
}
- if (holder->mFired)
+ if (mFired)
{
llwarns << "called after holder fired" << llendl;
return;
@@ -682,20 +536,26 @@ static void onWearableAssetFetch(LLWearable* wearable, void* data)
return;
}
- for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
- iter != holder->mFoundList.end(); ++iter)
+ for (LLWearableHoldingPattern::found_list_t::iterator iter = mFoundList.begin();
+ iter != mFoundList.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 < WT_COUNT) && (wearable->getType() == data.mWearableType));
+ 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)
{
@@ -724,13 +584,13 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& items)
items = new_items;
}
-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;
@@ -758,7 +618,7 @@ const LLViewerInventoryItem* LLAppearanceManager::getBaseOutfitLink()
return NULL;
}
-bool LLAppearanceManager::getBaseOutfitName(std::string& name)
+bool LLAppearanceMgr::getBaseOutfitName(std::string& name)
{
const LLViewerInventoryItem* outfit_link = getBaseOutfitLink();
if(outfit_link)
@@ -773,16 +633,102 @@ 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;
+
+ //only the item from a user's inventory is allowed
+ if (!gInventory.isObjectDescendentOf(item_id_to_wear, gInventory.getRootFolderID())) return false;
+
+ LLViewerInventoryItem* item_to_wear = gInventory.getItem(item_id_to_wear);
+ if (!item_to_wear) return false;
+
+ switch (item_to_wear->getType())
+ {
+ case LLAssetType::AT_CLOTHING:
+ 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 (replace || 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 LLAppearanceMgr::replaceCurrentOutfit(const LLUUID& new_outfit)
+{
+ LLViewerInventoryCategory* cat = gInventory.getCategory(new_outfit);
+ wearInventoryCategory(cat, false, false);
+}
+
+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;
+ LLFindWearables collector;
+
+ 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)
+ {
+ LLViewerInventoryItem* item = *it;
+ removeItemFromAvatar(item->getUUID());
+ }
}
// Create a copy of src_id + contents as a subfolder of dst_id.
-void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
+void LLAppearanceMgr::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
LLPointer<LLInventoryCallback> cb)
{
LLInventoryCategory *src_cat = gInventory.getCategory(src_id);
@@ -805,7 +751,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
}
// Copy contents of src_id to dst_id.
-void LLAppearanceManager::shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id,
+void LLAppearanceMgr::shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id,
LLPointer<LLInventoryCallback> cb)
{
LLInventoryModel::cat_array_t* cats;
@@ -820,10 +766,13 @@ void LLAppearanceManager::shallowCopyCategoryContents(const LLUUID& src_id, cons
{
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(),
+ item->LLInventoryItem::getDescription(),
LLAssetType::AT_LINK, cb);
break;
}
@@ -837,6 +786,7 @@ void LLAppearanceManager::shallowCopyCategoryContents(const LLUUID& src_id, cons
item->getLinkedUUID(),
dst_id,
item->getName(),
+ item->getDescription(),
LLAssetType::AT_LINK_FOLDER, cb);
}
break;
@@ -861,15 +811,15 @@ void LLAppearanceManager::shallowCopyCategoryContents(const LLUUID& src_id, cons
}
}
-BOOL LLAppearanceManager::getCanMakeFolderIntoOutfit(const LLUUID& folder_id)
+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 << WT_SHAPE;
- required_wearables |= 1LL << WT_SKIN;
- required_wearables |= 1LL << WT_HAIR;
- required_wearables |= 1LL << WT_EYES;
+ 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;
@@ -883,7 +833,7 @@ BOOL LLAppearanceManager::getCanMakeFolderIntoOutfit(const LLUUID& folder_id)
const LLViewerInventoryItem* item = (*iter);
if (item->isWearableType())
{
- const EWearableType wearable_type = item->getWearableType();
+ const LLWearableType::EType wearable_type = item->getWearableType();
folder_wearables |= 1LL << wearable_type;
}
}
@@ -893,7 +843,7 @@ BOOL LLAppearanceManager::getCanMakeFolderIntoOutfit(const LLUUID& folder_id)
}
-void LLAppearanceManager::purgeBaseOutfitLink(const LLUUID& category)
+void LLAppearanceMgr::purgeBaseOutfitLink(const LLUUID& category)
{
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
@@ -915,7 +865,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;
@@ -935,29 +885,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();
- if(type < 0 || type >= 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::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)
@@ -971,7 +908,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)
{
@@ -980,14 +917,20 @@ 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";
+
+ llinfos << "Linking Item [ name:" << item->getName() << " UUID:" << item->getUUID() << " ] to Category [ name:" << cat_name << " UUID:" << cat_uuid << " ] " << llendl; // Seraph remove for 2.1
}
}
-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;
@@ -1002,9 +945,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() );
}
}
}
@@ -1027,7 +970,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, 5);
// - Attachments: include COF contents only if appending.
LLInventoryModel::item_array_t obj_items;
@@ -1052,9 +995,13 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
llinfos << "creating LLUpdateAppearanceOnDestroy" << llendl;
LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;
+ llinfos << "Linking body items" << llendl; // Seraph remove for 2.1
linkAll(cof, body_items, link_waiter);
+ llinfos << "Linking wear items" << llendl; // Seraph remove for 2.1
linkAll(cof, wear_items, link_waiter);
+ llinfos << "Linking obj items" << llendl; // Seraph remove for 2.1
linkAll(cof, obj_items, link_waiter);
+ llinfos << "Linking gesture items" << llendl; // Seraph remove for 2.1
linkAll(cof, gest_items, link_waiter);
// Add link to outfit if category is an outfit.
@@ -1065,7 +1012,7 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
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"));
@@ -1075,7 +1022,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);
@@ -1085,7 +1032,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();
}
@@ -1093,7 +1040,7 @@ 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;
@@ -1101,7 +1048,7 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,
// For each wearable type, find the first instance in the category
// that we recursed through.
- for( S32 i = 0; i < WT_COUNT; i++ )
+ for( S32 i = 0; i < LLWearableType::WT_COUNT; i++ )
{
for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
iter != holder->mFoundList.end(); ++iter)
@@ -1110,14 +1057,12 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,
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;
}
}
}
@@ -1130,8 +1075,40 @@ 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;
@@ -1143,19 +1120,27 @@ 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;
@@ -1166,52 +1151,49 @@ void LLAppearanceManager::updateAppearanceFromCOF()
// callback will be called (and this object deleted)
// before the final getNextData().
- // BAP future cleanup - no point having found_container when
- // mFoundList already has all the info.
- 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)
+ if (item && item->getIsLinkType() && linked_item)
{
LLFoundData found(linked_item->getUUID(),
linked_item->getAssetUUID(),
linked_item->getName(),
linked_item->getType(),
- linked_item->isWearableType() ? linked_item->getWearableType() : WT_INVALID
+ linked_item->isWearableType() ? linked_item->getWearableType() : LLWearableType::WT_INVALID
);
#if 0
// Fault injection: uncomment this block to test asset
// fetch failures (should be replaced by new defaults in
// lost&found).
- if (found.mWearableType == WT_SHAPE || found.mWearableType == WT_JACKET)
+ if (found.mWearableType == LLWearableType::WT_SHAPE || found.mWearableType == LLWearableType::WT_JACKET)
{
found.mAssetID.generate(); // Replace with new UUID, guaranteed not to exist in DB
}
#endif
-
- holder->mFoundList.push_front(found);
- found_container.put(found);
+ //pushing back, not front, to preserve order of wearables for LLAgentWearables
+ holder->mFoundList.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->mFoundList.begin();
+ it != holder->mFoundList.end(); ++it)
{
- LLFoundData& found = found_container.get(i);
+ LLFoundData& found = *it;
llinfos << "waiting for onWearableAssetFetch callback, asset " << found.mAssetID.asString() << llendl;
@@ -1228,10 +1210,9 @@ void LLAppearanceManager::updateAppearanceFromCOF()
{
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)
@@ -1246,7 +1227,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,
@@ -1281,36 +1262,97 @@ 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)
{
if(!category) return;
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
@@ -1320,19 +1362,16 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca
llinfos << "wearInventoryCategoryOnAvatar( " << category->getName()
<< " )" << llendl;
- if( gFloaterCustomize )
- {
- gFloaterCustomize->askToSaveIfDirty(boost::bind(&LLAppearanceManager::changeOutfit,
- &LLAppearanceManager::instance(),
- _1, category->getUUID(), append));
- }
- else
+ if (gAgentCamera.cameraCustomizeAvatar())
{
- 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();
@@ -1368,7 +1407,7 @@ void LLAppearanceManager::wearOutfitByName(const std::string& name)
if(cat)
{
- LLAppearanceManager::wearInventoryCategory(cat, copy_items, false);
+ LLAppearanceMgr::wearInventoryCategory(cat, copy_items, false);
}
else
{
@@ -1404,7 +1443,7 @@ public:
if (item)
{
gInventory.removeObserver(this);
- LLAppearanceManager::instance().addCOFItemLink(item,mDoUpdate);
+ LLAppearanceMgr::instance().addCOFItemLink(item,mDoUpdate);
delete this;
}
}
@@ -1415,7 +1454,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)
@@ -1429,7 +1470,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)
@@ -1442,7 +1483,7 @@ 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);
@@ -1451,16 +1492,23 @@ void LLAppearanceManager::addCOFItemLink(const LLInventoryItem *item, bool do_up
{
// 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))
+ // TODO: MULTI-WEARABLE: check for wearable limit for clothing types
+ else if (is_body_part && (vitem->isWearableType()) && (vitem->getWearableType() == wearable_type))
{
- if (inv_item->getIsLinkType())
+ if (inv_item->getIsLinkType() && (vitem->getWearableType() == wearable_type))
{
gInventory.purgeObject(inv_item->getUUID());
}
@@ -1470,7 +1518,7 @@ void LLAppearanceManager::addCOFItemLink(const LLInventoryItem *item, bool do_up
{
if (do_update)
{
- LLAppearanceManager::updateAppearanceFromCOF();
+ LLAppearanceMgr::updateAppearanceFromCOF();
}
return;
}
@@ -1481,13 +1529,15 @@ void LLAppearanceManager::addCOFItemLink(const LLInventoryItem *item, bool do_up
vitem->getLinkedUUID(),
getCOF(),
vitem->getName(),
+ vitem->getDescription(),
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.
@@ -1496,18 +1546,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);
@@ -1521,11 +1572,45 @@ void LLAppearanceManager::removeCOFItemLinks(const LLUUID& item_id, bool do_upda
}
if (do_update)
{
- LLAppearanceManager::updateAppearanceFromCOF();
+ LLAppearanceMgr::updateAppearanceFromCOF();
}
}
-void LLAppearanceManager::updateIsDirty()
+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();
+ }
+}
+
+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;
@@ -1564,37 +1649,41 @@ 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 = (outfit_set != cof_set);
}
+
+ mOutfitIsDirty = false;
}
}
-void LLAppearanceManager::onFirstFullyVisible()
+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.
@@ -1611,9 +1700,301 @@ void LLAppearanceManager::onFirstFullyVisible()
check_populate_my_outfits = false;
}
+// Handler for anything that's deferred until avatar de-clouds.
+void LLAppearanceMgr::onFirstFullyVisible()
+{
+ gAgentAvatarp->debugAvatarVisible();
+ autopopulateOutfits();
+}
+
+bool LLAppearanceMgr::updateBaseOutfit()
+{
+ 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]);
+
+ 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()
+{
+ LLInventoryModel::item_array_t wear_items;
+ getDescendentsOfAssetType(getCOF(), 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): mFolderID(folder_id)
+ {}
+
+ virtual ~LLShowCreatedOutfit()
+ {
+ LLSD key;
+ LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key);
+ LLPanelOutfitsInventory *outfit_panel =
+ dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
+ if (outfit_panel)
+ {
+ outfit_panel->getRootFolder()->clearSelection();
+ outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE);
+ }
+
+ 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();
+ LLAppearanceMgr::getInstance()->updatePanelOutfitName("");
+ }
+
+ virtual void fire(const LLUUID&)
+ {}
+
+private:
+ LLUUID mFolderID;
+};
+
+LLUUID LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name)
+{
+ if (!isAgentAvatarValid()) 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);
+
+ updateClothingOrderingInfo();
+
+ LLPointer<LLInventoryCallback> cb = new LLShowCreatedOutfit(folder_id);
+ 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(), TRUE);
+ }
+
+ 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;
@@ -1634,7 +2015,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;
@@ -1646,22 +2027,23 @@ void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& it
llinfos << llendl;
}
-LLAppearanceManager::LLAppearanceManager():
+LLAppearanceMgr::LLAppearanceMgr():
mAttachmentInvLinkEnabled(false),
mOutfitIsDirty(false)
{
}
-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;
@@ -1679,15 +2061,14 @@ 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.
+ LLAppearanceMgr::addCOFItemLink(item_id, false); // Add COF link for item.
}
else
{
@@ -1695,17 +2076,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
{
@@ -1713,7 +2091,7 @@ void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id)
}
}
-void LLAppearanceManager::linkRegisteredAttachments()
+void LLAppearanceMgr::linkRegisteredAttachments()
{
for (std::set<LLUUID>::iterator it = mRegisteredAttachments.begin();
it != mRegisteredAttachments.end();
@@ -1725,15 +2103,22 @@ void LLAppearanceManager::linkRegisteredAttachments()
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 9d6cd34ad7..96541beb7d 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -43,18 +43,24 @@ class LLWearable;
class LLWearableHoldingPattern;
class LLInventoryCallback;
-class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
+class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr>
{
- friend class LLSingleton<LLAppearanceManager>;
+ friend class LLSingleton<LLAppearanceMgr>;
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 takeOffOutfit(const LLUUID& cat_id);
+ void addCategoryToCurrentOutfit(const LLUUID& cat_id);
// Copy all items and the src category itself.
void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
@@ -74,6 +80,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);
@@ -102,6 +114,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);
@@ -118,13 +131,38 @@ public:
// 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 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);
+
protected:
- LLAppearanceManager();
- ~LLAppearanceManager();
+ LLAppearanceMgr();
+ ~LLAppearanceMgr();
private:
+ //Check ordering information on wearables stored in links' descriptions and update if it is invalid
+ void updateClothingOrderingInfo();
+
void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type);
void getDescendentsOfAssetType(const LLUUID& category,
@@ -173,17 +211,17 @@ LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string&
// 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;
}
@@ -196,14 +234,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
{
@@ -212,7 +251,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);
@@ -239,10 +278,12 @@ void doOnIdleRepeating(T callable)
}
template <class T>
-class CallAfterCategoryFetchStage2: public LLInventoryFetchObserver
+class CallAfterCategoryFetchStage2: public LLInventoryFetchItemsObserver
{
public:
- CallAfterCategoryFetchStage2(T callable):
+ CallAfterCategoryFetchStage2(const uuid_vec_t& ids,
+ T callable) :
+ LLInventoryFetchItemsObserver(ids),
mCallable(callable)
{
}
@@ -252,7 +293,7 @@ public:
virtual void done()
{
gInventory.removeObserver(this);
- doOnIdle(mCallable);
+ doOnIdleOneTime(mCallable);
delete this;
}
protected:
@@ -263,7 +304,8 @@ template <class T>
class CallAfterCategoryFetchStage1: public LLInventoryFetchDescendentsObserver
{
public:
- CallAfterCategoryFetchStage1(T callable):
+ CallAfterCategoryFetchStage1(const LLUUID& cat_id, T callable) :
+ LLInventoryFetchDescendentsObserver(cat_id),
mCallable(callable)
{
}
@@ -277,14 +319,14 @@ public:
// 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);
S32 count = item_array.count();
if(!count)
{
- llwarns << "Nothing fetched in category " << mCompleteFolders.front()
+ llwarns << "Nothing fetched in category " << mComplete.front()
<< llendl;
//dec_busy_count();
gInventory.removeObserver(this);
@@ -292,8 +334,7 @@ public:
return;
}
- CallAfterCategoryFetchStage2<T> *stage2 = new CallAfterCategoryFetchStage2<T>(mCallable);
- LLInventoryFetchObserver::item_ref_t ids;
+ uuid_vec_t ids;
for(S32 i = 0; i < count; ++i)
{
ids.push_back(item_array.get(i)->getUUID());
@@ -302,8 +343,9 @@ public:
gInventory.removeObserver(this);
// do the fetch
- stage2->fetchItems(ids);
- if(stage2->isEverythingComplete())
+ CallAfterCategoryFetchStage2<T> *stage2 = new CallAfterCategoryFetchStage2<T>(ids, mCallable);
+ stage2->startFetch();
+ if(stage2->isFinished())
{
// everything is already here - call done.
stage2->done();
@@ -323,11 +365,9 @@ protected:
template <class T>
void callAfterCategoryFetch(const LLUUID& cat_id, T callable)
{
- CallAfterCategoryFetchStage1<T> *stage1 = new CallAfterCategoryFetchStage1<T>(callable);
- LLInventoryFetchDescendentsObserver::folder_ref_t folders;
- folders.push_back(cat_id);
- stage1->fetchDescendents(folders);
- if (stage1->isEverythingComplete())
+ CallAfterCategoryFetchStage1<T> *stage1 = new CallAfterCategoryFetchStage1<T>(cat_id, callable);
+ stage1->startFetch();
+ if (stage1->isFinished())
{
stage1->done();
}
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index bdfe0d9142..475a075d7e 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -44,6 +44,7 @@
#include "llviewertexturelist.h"
#include "llgroupmgr.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llwindow.h"
#include "llviewerstats.h"
@@ -78,6 +79,7 @@
#include "lllocationhistory.h"
#include "llfasttimerview.h"
#include "llvoicechannel.h"
+#include "llvoavatarself.h"
#include "llsidetray.h"
@@ -151,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
@@ -191,6 +193,9 @@
#include "llparcel.h"
#include "llavatariconctrl.h"
+// Include for security api initialization
+#include "llsecapi.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
@@ -304,8 +309,7 @@ static std::string gLaunchFileOnQuit;
// Used on Win32 for other apps to identify our window (eg, win_setup)
const char* const VIEWER_WINDOW_CLASSNAME = "Second Life";
-static const S32 FIRST_RUN_WINDOW_WIDTH = 1024;
-static const S32 FIRST_RUN_WINDOW_HIGHT = 768;
+
//----------------------------------------------------------------------------
// List of entries from strings.xml to always replace
@@ -356,7 +360,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
@@ -506,35 +510,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()
{
@@ -646,7 +621,6 @@ bool LLAppViewer::init()
LLCurl::initClass();
initThreads();
-
writeSystemInfo();
// Build a string representing the current version number.
@@ -776,10 +750,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
@@ -861,7 +831,7 @@ bool LLAppViewer::init()
minSpecs += "\n";
unsupported = true;
}
- if(gSysCPU.getMhz() < minCPU)
+ if(gSysCPU.getMHz() < minCPU)
{
minSpecs += LLNotifications::instance().getGlobalString("UnsupportedCPU");
minSpecs += "\n";
@@ -891,6 +861,7 @@ bool LLAppViewer::init()
}
}
+
// save the graphics card
gDebugInfo["GraphicsCard"] = LLFeatureManager::getInstance()->getGPUString();
@@ -901,6 +872,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)
{
@@ -935,13 +917,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());
@@ -1108,12 +1088,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;
@@ -1144,6 +1127,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 &&
@@ -1153,25 +1138,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();
@@ -1260,7 +1252,7 @@ bool LLAppViewer::cleanup()
// to ensure shutdown order
LLMortician::setZealous(TRUE);
- LLVoiceClient::terminate();
+ LLVoiceClient::getInstance()->terminate();
disconnectViewer();
@@ -1459,13 +1451,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());
@@ -1514,6 +1499,11 @@ 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;
@@ -1634,7 +1624,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;
}
@@ -2032,7 +2022,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"))
@@ -2126,30 +2115,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");
@@ -2199,10 +2175,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();
@@ -2228,18 +2206,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;
@@ -2295,9 +2265,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");
@@ -2370,46 +2340,23 @@ bool LLAppViewer::initWindow()
// store setting in a global for easy access and modification
gNoRender = gSavedSettings.getBOOL("DisableRendering");
- S32 window_x = gSavedSettings.getS32("WindowX");
- S32 window_y = gSavedSettings.getS32("WindowY");
- S32 window_width = gSavedSettings.getS32("WindowWidth");
- S32 window_height = gSavedSettings.getS32("WindowHeight");
-
- bool show_maximized = gSavedSettings.getBOOL("WindowMaximized");
-
- bool first_run = gSavedSettings.getBOOL("FirstLoginThisInstall");
-
- if (first_run)//for first login
- {
- window_width = FIRST_RUN_WINDOW_WIDTH;//yep hardcoded
- window_height = FIRST_RUN_WINDOW_HIGHT;
-
- //if screen resolution is lower then 1024*768 then show maximized
- LLDisplayInfo display_info;
- if(display_info.getDisplayWidth() <= FIRST_RUN_WINDOW_WIDTH
- || display_info.getDisplayHeight()<=FIRST_RUN_WINDOW_HIGHT)
- {
- show_maximized = true;
- }
- }
-
// always start windowed
BOOL ignorePixelDepth = gSavedSettings.getBOOL("IgnorePixelDepth");
gViewerWindow = new LLViewerWindow(gWindowTitle,
VIEWER_WINDOW_CLASSNAME,
- window_x, window_y,
- window_width, window_height,
+ gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"),
+ gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"),
FALSE, ignorePixelDepth);
LLNotificationsUI::LLNotificationManager::getInstance();
- if (gSavedSettings.getBOOL("WindowFullScreen"))
+ if (gSavedSettings.getBOOL("FullScreen"))
{
// request to go full screen... which will be delayed until login
gViewerWindow->toggleFullscreen(FALSE);
}
- if (show_maximized)
+ if (gSavedSettings.getBOOL("WindowMaximized"))
{
gViewerWindow->mWindow->maximize();
gViewerWindow->getWindow()->setNativeAspectRatio(gSavedSettings.getF32("FullScreenAspectRatio"));
@@ -2504,9 +2451,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);
}
}
@@ -2530,7 +2477,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();
@@ -2541,9 +2488,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;
@@ -2587,6 +2534,8 @@ 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();
@@ -3022,41 +2971,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 = 6;
- 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;
@@ -3064,26 +3069,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;
@@ -3229,6 +3233,14 @@ bool LLAppViewer::initCache()
else
{
LLVFile::initClass();
+
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ if (gSavedSettings.getBOOL("DumpVFSCaches"))
+ {
+ dumpVFSCaches();
+ }
+#endif
+
return true;
}
}
@@ -3341,10 +3353,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();
@@ -3626,7 +3638,7 @@ void LLAppViewer::idle()
// Handle pending gesture processing
static LLFastTimer::DeclareTimer ftm("Agent Position");
LLFastTimer t(ftm);
- LLGestureManager::instance().update();
+ LLGestureMgr::instance().update();
gAgent.updateAgentPosition(gFrameDTClamped, yaw, current_mouse.mX, current_mouse.mY);
}
@@ -3754,7 +3766,7 @@ void LLAppViewer::idle()
LLViewerJoystick::getInstance()->moveObjects();
}
- gAgent.updateCamera();
+ gAgentCamera.updateCamera();
}
// update media focus
@@ -3852,7 +3864,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;
}
@@ -3864,7 +3876,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;
}
@@ -3892,7 +3904,7 @@ void LLAppViewer::sendLogoutRequest()
gLogoutMaxTime = LOGOUT_REQUEST_TIME;
mLogoutRequestSent = TRUE;
- gVoiceClient->leaveChannel();
+ LLVoiceClient::getInstance()->leaveChannel();
//Set internal status variables and marker files
gLogoutInProgress = TRUE;
@@ -3930,9 +3942,7 @@ void LLAppViewer::idleNetwork()
{
LLMemType mt_in(LLMemType::MTYPE_IDLE_NETWORK);
pingMainloopTimeout("idleNetwork");
- LLError::LLCallStacks::clear() ;
- llpushcallstacks ;
-
+
gObjectList.mNumNewObjects = 0;
S32 total_decoded = 0;
@@ -3942,7 +3952,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
@@ -4012,16 +4021,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();
@@ -4037,7 +4043,6 @@ void LLAppViewer::idleNetwork()
mAgentRegionLastID = this_region_id;
mAgentRegionLastAlive = this_region_alive;
}
- llpushcallstacks ;
}
void LLAppViewer::disconnectViewer()
@@ -4088,7 +4093,7 @@ void LLAppViewer::disconnectViewer()
LLFloaterInventory::cleanup();
gAgentWearables.cleanup();
-
+ gAgentCamera.cleanup();
// Also writes cached agent settings to gSavedSettings
gAgent.cleanup();
@@ -4312,7 +4317,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
@@ -4325,10 +4330,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 a915b7fa50..5acd6e11c4 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -102,6 +102,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; }
@@ -191,7 +193,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..78b0f7ba83 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -604,7 +604,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};
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index 80d9b14345..0b5f18c330 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>
@@ -291,6 +290,7 @@ static OSStatus CarbonEventHandler(EventHandlerCallRef inHandlerCallRef,
if(os_result >= 0 && matching_psn)
{
sCrashReporterIsRunning = false;
+ QuitApplicationEventLoop();
}
}
return noErr;
@@ -326,7 +326,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 +356,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,
@@ -453,16 +451,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;
}
@@ -470,11 +469,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;
@@ -487,13 +490,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/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 12cff32780..60a6d2f072 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -469,7 +469,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 +480,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())
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index a2322e28b4..27dcb9f1c7 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
{
@@ -198,13 +203,19 @@ void LLAssetUploadResponder::uploadComplete(const LLSD& content)
LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(const LLSD& post_data,
const LLUUID& vfile_id,
- LLAssetType::EType asset_type)
-: LLAssetUploadResponder(post_data, vfile_id, asset_type)
+ LLAssetType::EType asset_type,
+ boost::function<void(const LLUUID& uuid)> callback)
+: LLAssetUploadResponder(post_data, vfile_id, asset_type),
+ mCallback(callback)
{
}
-LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(const LLSD& post_data, const std::string& file_name, LLAssetType::EType asset_type)
-: LLAssetUploadResponder(post_data, file_name, asset_type)
+LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(const LLSD& post_data,
+ const std::string& file_name,
+ LLAssetType::EType asset_type,
+ boost::function<void(const LLUUID& uuid)> callback)
+: LLAssetUploadResponder(post_data, file_name, asset_type),
+ mCallback(callback)
{
}
@@ -278,10 +289,16 @@ 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();
+
+ if (mCallback)
+ {
+ // call the callback with the new Asset UUID
+ mCallback(item->getAssetUUID());
+ }
// Show the preview panel for textures and sounds to let
// user know that the image (or snapshot) arrived intact.
@@ -329,13 +346,11 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
U32 group_perms = mPostData.has("group_mask") ? mPostData.get("group_mask" ).asInteger() : PERM_NONE;
U32 next_owner_perms = mPostData.has("next_owner_mask") ? mPostData.get("next_owner_mask").asInteger() : PERM_NONE;
std::string display_name = LLStringUtil::null;
- LLAssetStorage::LLStoreAssetCallback callback = NULL;
- void *userdata = NULL;
upload_new_resource(next_file, asset_name, asset_name,
- 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
+ LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
next_owner_perms, group_perms,
everyone_perms, display_name,
- callback, expected_upload_cost, userdata);
+ NULL, expected_upload_cost);
}
}
@@ -473,10 +488,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..ade9c96758 100644
--- a/indra/newview/llassetuploadresponders.h
+++ b/indra/newview/llassetuploadresponders.h
@@ -33,6 +33,7 @@
#ifndef LL_LLASSETUPLOADRESPONDER_H
#define LL_LLASSETUPLOADRESPONDER_H
+#include "llassetstorage.h"
#include "llhttpclient.h"
// Abstract class for supporting asset upload
@@ -66,10 +67,15 @@ class LLNewAgentInventoryResponder : public LLAssetUploadResponder
public:
LLNewAgentInventoryResponder(const LLSD& post_data,
const LLUUID& vfile_id,
- LLAssetType::EType asset_type);
- LLNewAgentInventoryResponder(const LLSD& post_data, const std::string& file_name,
- LLAssetType::EType asset_type);
+ LLAssetType::EType asset_type,
+ boost::function<void(const LLUUID& uuid)> callback = NULL);
+ LLNewAgentInventoryResponder(const LLSD& post_data,
+ const std::string& file_name,
+ LLAssetType::EType asset_type,
+ boost::function<void(const LLUUID& uuid)> callback = NULL);
virtual void uploadComplete(const LLSD& content);
+
+ boost::function<void(const LLUUID& uuid)> mCallback;
};
class LLBakedUploadData;
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 e6666c7f83..875ed72a12 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,14 +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"
@@ -113,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;
@@ -144,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);
}
@@ -161,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;
@@ -228,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)
{
@@ -237,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);
}
@@ -274,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);
}
@@ -417,6 +431,110 @@ 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;
+ }
+
+ /**
+ * 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;
+
+ S32 count = llmin(avatar_names.size(), avatar_uuids.size());
+
+ // iterate through avatars
+ for(S32 i = 0; i < count; ++i)
+ {
+ const std::string& avatar_name = avatar_names[i];
+ const LLUUID& avatar_uuid = avatar_uuids[i];
+
+ // Start up IM before give the item
+ const LLUUID session_id = gIMMgr->addSession(avatar_name, 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();
+
+ // 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);
+ break;
+ }
+ LLViewerInventoryItem* inv_item = gInventory.getItem(*it);
+ LLGiveInventory::doGiveInventoryItem(avatar_uuid, inv_item, session_id);
+ }
+ }
+ }
+}
+
+//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));
+ LLNotificationsUtil::add("ShareNotification");
+}
+
// static
void LLAvatarActions::toggleBlock(const LLUUID& id)
{
@@ -434,6 +552,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)
{
@@ -499,7 +631,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 a7f3acad4f..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.
@@ -114,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);
@@ -171,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/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 45c540b3a3..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();
}
}
@@ -192,6 +208,18 @@ void LLAvatarList::setDirty(bool val /*= true*/, bool force_refresh /*= false*/)
}
}
+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
//////////////////////////////////////////////////////////////////////////
@@ -204,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;
@@ -236,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;
@@ -291,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.
@@ -303,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;
@@ -334,6 +360,17 @@ 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();
@@ -358,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.
{
@@ -382,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.
@@ -459,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 00c72f1f9d..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,14 @@ public:
virtual void clear();
+ virtual void setVisible(BOOL visible);
+
void setNameFilter(const std::string& filter);
void setDirty(bool val = true, bool force_refresh = false);
- uuid_vector_t& getIDs() { return mIDs; }
+ 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; }
@@ -96,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);
@@ -120,10 +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;
@@ -175,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 9645e75e60..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, const LLUUID& session_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, 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",
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index cecb64add7..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, const LLUUID& session_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 b88be53d79..ae97460468 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();
@@ -61,7 +73,7 @@ namespace
const std::string& PANEL_CAMERA_NAME = "cam_panel";
const std::string& PANEL_GESTURE_NAME = "gesture_panel";
- S32 get_panel_min_width(LLLayoutStack* stack, LLPanel* panel)
+ S32 get_panel_min_width(LLLayoutStack* stack, LLView* panel)
{
S32 minimal_width = 0;
llassert(stack);
@@ -125,7 +137,7 @@ public:
void onFocusLost()
{
- if (gAgent.cameraMouselook())
+ if (gAgentCamera.cameraMouselook())
{
LLBottomTray::getInstance()->setVisible(FALSE);
}
@@ -144,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)
@@ -160,10 +168,6 @@ 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));
//this is to fix a crash that occurs because LLBottomTray is a singleton
@@ -171,8 +175,6 @@ LLBottomTray::LLBottomTray(const LLSD&)
//destroyed LLBottomTray requires some subsystems that are long gone
//LLUI::getRootView()->addChild(this);
- initStateProcessedObjectMap();
-
// Necessary for focus movement among child controls
setFocusRoot(TRUE);
@@ -189,23 +191,12 @@ 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);
}
}
@@ -325,7 +316,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());
}
}
@@ -371,6 +362,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
@@ -395,22 +417,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)
@@ -457,12 +469,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");
@@ -478,15 +486,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;
}
@@ -648,6 +665,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)
@@ -710,27 +745,9 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width)
S32 buttons_freed_width = 0;
if (still_should_be_processed)
{
- 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);
- }
+ processShrinkButtons(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)
{
@@ -775,27 +792,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;
@@ -852,9 +852,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)
@@ -867,15 +884,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;
}
@@ -883,9 +900,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)
@@ -896,11 +930,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);
@@ -908,24 +942,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;
@@ -945,24 +984,25 @@ void LLBottomTray::processShrinkButtons(S32* required_width, S32* buttons_freed_
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)
{
@@ -988,64 +1028,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_MOVEMENT, available_width);
- }
- if (*available_width > 0)
- {
- processExtendButton(RS_BUTTON_CAMERA, 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) // HACK: this button doesn't change size so possible_extend_width will be 0
+ 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)
{
@@ -1064,68 +1110,158 @@ 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
- switch(processed_object_type)
+ // 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();
+
+ // 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_SIDEBAR, getChild<LLPanel>("sidebar_btn_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_SIDEBAR);
+ 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_SIDEBAR, gSavedSettings.getBOOL("ShowSidebarButton"));
+ 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.declareBOOL("ShowGestureButton", TRUE, "Shows/Hides Gesture button in the bottom tray. (Declared in code)");
+ gSavedSettings.declareBOOL("ShowMoveButton", TRUE, "Shows/Hides Move button in the bottom tray. (Declared in code)");
+ gSavedSettings.declareBOOL("ShowSnapshotButton", TRUE, "Shows/Hides Snapshot button button in the bottom tray. (Declared in code)");
+ gSavedSettings.declareBOOL("ShowCameraButton", TRUE, "Show/Hide View button in the bottom tray. (Declared in code)");
+ gSavedSettings.declareBOOL("ShowSidebarButton", TRUE, "Shows/hides Sidebar button in the bottom tray. (Declared in code)");
+ gSavedSettings.declareBOOL("ShowBuildButton", TRUE, "Shows/Hides Build button in the bottom tray. (Declared in code)");
+ gSavedSettings.declareBOOL("ShowSearchButton", TRUE, "Shows/Hides Search button in the bottom tray. (Declared in code)");
+ gSavedSettings.declareBOOL("ShowWorldMapButton", TRUE, "Shows/Hides Map button in the bottom tray. (Declared in code)");
+ gSavedSettings.declareBOOL("ShowMiniMapButton", TRUE, "Shows/Hides Mini-Map button in the bottom tray. (Declared in code)");
+
+ gSavedSettings.declareS32("ChatBarCustomWidth", 0, "Stores customized width of chat bar. (Declared in code)");
+
+ 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("ShowSidebarButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SIDEBAR, _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)
{
@@ -1134,12 +1270,6 @@ void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool vis
}
panel->setVisible(visible);
-
- if (mDummiesMap.count(shown_object_type))
- {
- // Hide/show layout panel for dummy icon.
- mDummiesMap[shown_object_type]->getParent()->setVisible(visible);
- }
}
void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification)
@@ -1162,20 +1292,13 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible
return false;
}
- const S32 dummy_width = mDummiesMap.count(object_type)
- ? mDummiesMap[object_type]->getParent()->getRect().getWidth()
- : 0;
-
bool is_set = true;
if (visible)
{
- // Assume that only chiclet panel can be auto-resized and
- // don't take into account width of dummy widgets
+ // Assume that only chiclet panel can be auto-resized
const S32 available_width =
- mChicletPanel->getParent()->getRect().getWidth() -
- mChicletPanel->getMinWidth() -
- dummy_width;
+ mChicletPanel->getParent()->getRect().getWidth() - mChicletPanel->getMinWidth();
S32 preferred_width = mObjectDefaultWidthMap[object_type];
S32 current_width = cur_panel->getRect().getWidth();
@@ -1199,17 +1322,18 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible
const S32 chatbar_shrunk_width =
mNearbyChatBar->getRect().getWidth() - get_panel_min_width(mToolbarStack, mNearbyChatBar);
- const S32 sum_of_min_widths =
- get_panel_min_width(mToolbarStack, mStateProcessedObjectMap[RS_BUTTON_CAMERA]) +
- get_panel_min_width(mToolbarStack, mStateProcessedObjectMap[RS_BUTTON_MOVEMENT]) +
- get_panel_min_width(mToolbarStack, mStateProcessedObjectMap[RS_BUTTON_GESTURES]) +
- get_panel_min_width(mToolbarStack, mSpeakPanel);
+ S32 sum_of_min_widths = get_panel_min_width(mToolbarStack, mSpeakPanel);
+ S32 sum_of_curr_widths = get_curr_width(mSpeakPanel);
- const S32 sum_of_curr_widths =
- get_curr_width(mStateProcessedObjectMap[RS_BUTTON_CAMERA]) +
- get_curr_width(mStateProcessedObjectMap[RS_BUTTON_MOVEMENT]) +
- get_curr_width(mStateProcessedObjectMap[RS_BUTTON_GESTURES]) +
- get_curr_width(mSpeakPanel);
+ 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)
+ {
+ 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 possible_shrunk_width =
chatbar_shrunk_width + (sum_of_curr_widths - sum_of_min_widths);
@@ -1238,12 +1362,12 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible
current_width = result_width;
}
- is_set = processShowButton(object_type, &current_width);
+ is_set = processShowButton(object_type, current_width);
// Shrink buttons if needed
if (is_set && decrease_width)
{
- processWidthDecreased( -result_width - dummy_width );
+ processWidthDecreased( -result_width);
}
}
else
@@ -1258,10 +1382,65 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible
// Extend other buttons if need
if (delta_width)
{
- processWidthIncreased(delta_width + dummy_width);
+ 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
+ {
+ 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);
+ }
+}
+
//EOF
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 18c14e5e19..c0887df39a 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);
@@ -116,37 +118,155 @@ 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
+ , RS_BUTTON_SIDEBAR = 0x2000
+
+ /*
+ 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
+ | RS_BUTTON_SIDEBAR
}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);
- void processShrinkButton(EResizeState processed_object_type, S32* required_width);
+ 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 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);
- void processExtendButton(EResizeState processed_object_type, S32* available_width);
+ 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 processExtendButton(EResizeState processed_object_type, S32& available_width);
/**
* Determines if specified by type object can be shown. It should be hidden by shrink before.
@@ -155,7 +275,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.
@@ -184,6 +334,26 @@ private:
*/
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;
@@ -192,15 +362,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);
@@ -213,10 +385,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 c8552de66a..dd99c6564c 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
@@ -131,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);
}
@@ -191,7 +189,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)
{
@@ -209,13 +207,12 @@ void LLCallFloater::draw()
void LLCallFloater::onChange()
{
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);
}
@@ -230,7 +227,7 @@ void LLCallFloater::leaveCall()
LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel();
if (voice_channel)
{
- voice_channel->deactivate();
+ gIMMgr->endCall(voice_channel->getSessionID());
}
}
@@ -239,11 +236,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
@@ -253,7 +250,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)
@@ -293,7 +289,7 @@ void LLCallFloater::updateSession()
{
// by default let 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;
}
@@ -336,7 +332,7 @@ 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);
@@ -469,19 +465,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()
@@ -494,7 +489,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)
@@ -505,7 +500,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
@@ -534,10 +529,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.
@@ -555,9 +550,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
@@ -603,10 +598,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
@@ -665,8 +663,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);
@@ -695,7 +693,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();
}
@@ -727,7 +725,7 @@ void LLCallFloater::connectToChannel(LLVoiceChannel* channel)
void LLCallFloater::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
{
// check is voice operational and if it doesn't work hide VCP (EXT-4397)
- if(LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking())
+ if(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking())
{
updateState(new_state);
}
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index 79a2631c31..1a6c11fa73 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -700,6 +700,7 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
args["FIRST"] = first;
args["LAST"] = last;
}
+
}
}
else
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..67d5d21b2a 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
@@ -209,8 +209,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 +296,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 +377,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 +516,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 +653,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 e1c96d4a16..bd14732b4a 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -93,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;
@@ -632,7 +632,14 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
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)
{
@@ -640,20 +647,19 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
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;
@@ -734,8 +740,8 @@ 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();
@@ -743,7 +749,9 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
ctrl_list_t ctrls = notify_box->getControlPanel()->getCtrlList();
S32 offset = 0;
- for (ctrl_list_t::iterator it = ctrls.begin(); it != ctrls.end(); it++)
+ // 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++)
{
LLButton * button = dynamic_cast<LLButton*> (*it);
if (button != NULL)
@@ -758,7 +766,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
button->getRect().mBottom));
button->setAutoResize(true);
button->autoResize();
- offset += 2 * HPAD + button->getRect().getWidth();
+ offset += HPAD + button->getRect().getWidth();
button->setFollowsNone();
}
}
@@ -817,7 +825,6 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
message = chat.mFromName + message;
}
-
mEditor->appendText(message, FALSE, style_params);
}
mEditor->blockUndo();
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 81edb55f93..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;
@@ -190,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);
}
@@ -322,10 +326,14 @@ void LLNearbyChatToastPanel::draw()
if(icon)
{
icon->setDrawTooltip(mSourceType == CHAT_SOURCE_AGENT);
- if(mSourceType == CHAT_SOURCE_AGENT)
- icon->setValue(mFromID);
- else
+ 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/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 8efa814a2e..6897f4ee8e 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -131,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);
@@ -152,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()
@@ -179,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;
}
@@ -229,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)
@@ -307,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);
}
/************************************************************************/
@@ -456,6 +470,7 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)
, mSpeakerCtrl(NULL)
, mCounterCtrl(NULL)
, mChicletButton(NULL)
+, mPopupMenu(NULL)
{
enableCounterControl(p.enable_counter);
}
@@ -639,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;
+}
+
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -656,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);
@@ -711,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));
@@ -788,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);
@@ -858,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));
@@ -886,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;
-}
-
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -920,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);
@@ -1033,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;
+ if(!canCreateMenu())
return;
- }
- if(getSessionId().isNull())
- {
- return;
- }
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
registrar.add("IMChicletMenu.Action", boost::bind(&LLIMGroupChiclet::onMenuItemClicked, this, _2));
@@ -1137,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;
}
@@ -1908,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());
+}
+
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -1969,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 ba17c5970e..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);
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..dfc203111a
--- /dev/null
+++ b/indra/newview/llcofwearables.cpp
@@ -0,0 +1,457 @@
+/**
+ * @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 "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"
+
+static LLRegisterPanelClassWrapper<LLCOFAccordionListAdaptor> t_cof_accodion_list_adaptor("accordion_list_adaptor");
+
+static LLRegisterPanelClassWrapper<LLCOFWearables> t_cof_wearables("cof_wearables");
+
+const LLSD REARRANGE = LLSD().with("rearrange", LLSD());
+
+static const LLWearableItemNameComparator WEARABLE_NAME_COMPARATOR;
+
+
+//////////////////////////////////////////////////////////////////////////
+
+class CofAttachmentContextMenu : public LLListContextMenu
+{
+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 LLListContextMenu
+{
+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));
+
+ enable_registrar.add("Clothing.OnEnable", boost::bind(&CofClothingContextMenu::onEnable, this, _2));
+
+ return createFromFile("menu_cof_clothing.xml");
+ }
+
+ 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 ("edit" == param)
+ {
+ return 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 LLListContextMenu
+{
+protected:
+
+ /*virtual*/ LLContextMenu* createMenu()
+ {
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+ LLUUID selected_id = mUUIDs.back();
+
+ registrar.add("BodyPart.Replace", boost::bind(&LLAppearanceMgr::wearItemOnAvatar,
+ LLAppearanceMgr::getInstance(), selected_id, true, true));
+ registrar.add("BodyPart.Edit", boost::bind(LLAgentWearables::editWearable, selected_id));
+
+ enable_registrar.add("BodyPart.OnEnable", boost::bind(&CofBodyPartContextMenu::onEnable, this, _2));
+
+ return createFromFile("menu_cof_body_part.xml");
+ }
+
+ bool onEnable(const LLSD& data)
+ {
+ std::string param = data.asString();
+ LLUUID selected_id = mUUIDs.back();
+
+ if ("edit" == param)
+ {
+ return gAgentWearables.isWearableModifiable(selected_id);
+ }
+
+ return true;
+ }
+};
+
+//////////////////////////////////////////////////////////////////////////
+
+LLCOFWearables::LLCOFWearables() : LLPanel(),
+ mAttachments(NULL),
+ mClothing(NULL),
+ mBodyParts(NULL),
+ mLastSelectedList(NULL)
+{
+ mClothingMenu = new CofClothingContextMenu();
+ mAttachmentMenu = new CofAttachmentContextMenu();
+ mBodyPartMenu = new CofBodyPartContextMenu();
+};
+
+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);
+
+ 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();
+
+ 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_panel", last);
+
+ return item_panel;
+}
+
+LLPanelBodyPartsListItem* LLCOFWearables::buildBodypartListItem(LLViewerInventoryItem* item)
+{
+ llassert(item);
+
+ 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();
+
+ 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;
+
+ LLPanelDeletableWearableListItem* item_panel = LLPanelDeletableWearableListItem::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;
+ 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;
+}
+
+void LLCOFWearables::clear()
+{
+ mAttachments->clear();
+ mClothing->clear();
+ mBodyParts->clear();
+}
+
+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..590aa709dd
--- /dev/null
+++ b/indra/newview/llcofwearables.h
@@ -0,0 +1,159 @@
+/**
+ * @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;
+
+/**
+ * Adaptor between LLAccordionCtrlTab and LLFlatListView to facilitate communication between them
+ * (notify, notifyParent) regarding size changes of a list and selection changes across accordion tabs.
+ * Besides that it acts as a container for the LLFlatListView and a button bar on top of it.
+ */
+class LLCOFAccordionListAdaptor : public LLPanel
+{
+public:
+ LLCOFAccordionListAdaptor() : LLPanel() {};
+ ~LLCOFAccordionListAdaptor() {};
+
+ S32 notifyParent(const LLSD& info)
+ {
+ LLView* parent = getParent();
+ if (!parent) return -1;
+
+ if (!(info.has("action") && "size_changes" == info["action"].asString()))
+ {
+ return parent->notifyParent(info);
+ }
+
+ LLRect rc;
+ childGetRect("button_bar", rc);
+
+ LLSD params;
+ params["action"] = "size_changes";
+ params["width"] = info["width"];
+ params["height"] = info["height"].asInteger() + rc.getHeight();
+
+ return parent->notifyParent(params);
+ }
+
+
+ S32 notify(const LLSD& info)
+ {
+ for (child_list_const_iter_t iter = beginChild(); iter != endChild(); iter++)
+ {
+ if (dynamic_cast<LLFlatListView*>(*iter))
+ {
+ return (*iter)->notify(info);
+ }
+ }
+ return LLPanel::notify(info);
+ };
+};
+
+
+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 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);
+
+ void refresh();
+ void clear();
+
+ 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/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 be6c15eab4..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;
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/lldrawpool.cpp b/indra/newview/lldrawpool.cpp
index ef946ac49e..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;
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index d09d4a412f..19cdccb630 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -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 ;
}
diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp
index 1a5d55d793..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());
+ 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());
+ }
}
}
}
@@ -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 830e975e8a..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;
}
@@ -535,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);
@@ -552,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.
@@ -626,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/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index 362010d65a..149ba2478d 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -112,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);
diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h
index 9d4a8aef76..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();
};
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 9de69a8173..e0e5b32299 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -867,7 +867,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
const LLMatrix4& mat_vert, const LLMatrix3& mat_normal,
const U16 &index_offset)
{
- llpushcallstacks ;
const LLVolumeFace &vf = volume.getVolumeFace(f);
S32 num_vertices = (S32)vf.mVertices.size();
S32 num_indices = LLPipeline::sUseTriStrips ? (S32)vf.mTriStrip.size() : (S32) vf.mIndices.size();
@@ -1377,9 +1376,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)
{
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index bf7c735488..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;
};
/**
@@ -1158,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;
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index fbb90c69f3..4fdb010162 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;
}
@@ -302,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;
}
@@ -403,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 = "http://viewer-settings.s3.amazonaws.com/";
+
+ 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());
@@ -621,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..fd99f673e0
--- /dev/null
+++ b/indra/newview/llfilteredwearablelist.cpp
@@ -0,0 +1,111 @@
+/**
+ * @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"
+
+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;
+ }
+
+private:
+ U64 mFilterMask;
+};
+
+//////////////////////////////////////////////////////////////////////////
+
+LLFilteredWearableListManager::LLFilteredWearableListManager(LLInventoryItemsList* list, U64 filter_mask)
+: mWearableList(list)
+, mFilterMask(filter_mask)
+{
+ llassert(mWearableList);
+ gInventory.addObserver(this);
+ gInventory.fetchDescendentsOf(gInventory.getRootFolderID());
+}
+
+LLFilteredWearableListManager::~LLFilteredWearableListManager()
+{
+ gInventory.removeObserver(this);
+}
+
+void LLFilteredWearableListManager::changed(U32 mask)
+{
+ if(!gInventory.isInventoryUsable())
+ {
+ return;
+ }
+
+ populateList();
+}
+
+void LLFilteredWearableListManager::setFilterMask(U64 mask)
+{
+ mFilterMask = mask;
+ populateList();
+}
+
+void LLFilteredWearableListManager::populateList()
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ LLFindNonLinksByMask collector(mFilterMask);
+
+ gInventory.collectDescendentsIf(
+ gInventory.getRootFolderID(),
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH,
+ collector);
+
+ // 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..0780c02442
--- /dev/null
+++ b/indra/newview/llfilteredwearablelist.h
@@ -0,0 +1,70 @@
+/**
+ * @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 "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, U64 filter_mask);
+ ~LLFilteredWearableListManager();
+
+ /** LLInventoryObserver implementation
+ *
+ */
+ /*virtual*/ void changed(U32 mask);
+
+ /**
+ * Sets new filter and applies it immediately
+ */
+ void setFilterMask(U64 mask);
+
+ /**
+ * Populates wearable list with filtered data.
+ */
+ void populateList();
+
+private:
+ LLInventoryItemsList* mWearableList;
+ U64 mFilterMask;
+};
+
+#endif //LL_LLFILTEREDWEARABLELIST_H
+
+// EOF
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index ef69f39ad2..56bc4a7933 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -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)";
diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp
index 5ec58c8dd6..043f753e01 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())
{
@@ -1001,19 +1001,18 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata)
{
std::string name = floaterp->childGetValue("name_form").asString();
std::string desc = floaterp->childGetValue("description_form").asString();
- LLAssetStorage::LLStoreAssetCallback callback = NULL;
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
- void *userdata = NULL;
upload_new_resource(floaterp->mTransactionID, // tid
LLAssetType::AT_ANIMATION,
name,
desc,
- 0,
LLFolderType::FT_NONE,
LLInventoryType::IT_ANIMATION,
- LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
+ LLFloaterPerms::getNextOwnerPerms(),
+ LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
name,
- callback, expected_upload_cost, userdata);
+ NULL,
+ expected_upload_cost);
}
else
{
@@ -1069,6 +1068,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..b40c19c2c6 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,68 @@ 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);
+ }
+ }
+ }
+ }
+ *accept = ACCEPT_NO;
+ return TRUE;
+}
+
// static
void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void**)
{
@@ -387,8 +463,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 +575,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..e69b814f9f 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,11 @@ 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);
+
private:
void editKeystroke(class LLLineEditor* caller, void* user_data);
@@ -77,6 +84,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..fd392d949a 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,74 @@ 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))
+ LLFloaterAvatarTextures* self = (LLFloaterAvatarTextures*)data;
+ LLVOAvatar* avatarp = find_avatar(self->mID);
+ 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/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..46b3695511 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,13 +246,15 @@ 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->getIsLinkType(),
inv_item->getFlags(),
item_is_multi);
row["columns"][0]["column"] = "icon";
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..c35653178a 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,13 +216,14 @@ 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->getIsLinkType(),
inv_item->getFlags(),
item_is_multi);
row["columns"][0]["column"] = "icon";
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..5815df36d1
--- /dev/null
+++ b/indra/newview/llfloaterbuycurrencyhtml.cpp
@@ -0,0 +1,119 @@
+/**
+ * @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 );
+
+ // kick off the navigation
+ mBrowser->navigateTo( buy_currency_url );
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+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 )
+ {
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLFloaterBuyCurrencyHTML::onClose( bool app_quitting )
+{
+ 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 d37bc01885..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"
@@ -830,7 +831,7 @@ void LLFloaterBuyLandUI::updateNames()
else
{
mParcelSellerName =
- LLSLURL::buildCommand("agent", parcelp->getOwnerID(), "inspect");
+ LLSLURL("agent", parcelp->getOwnerID(), "inspect").getSLURLString();
}
}
@@ -859,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;
@@ -1172,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
{
@@ -1187,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 d0188352c7..d84ebef1dd 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -38,11 +38,11 @@
#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"
@@ -104,7 +104,7 @@ BOOL LLPanelCameraZoom::postBuild()
void LLPanelCameraZoom::draw()
{
- mSlider->setValue(gAgent.getCameraZoomFraction());
+ mSlider->setValue(gAgentCamera.getCameraZoomFraction());
LLPanel::draw();
}
@@ -131,7 +131,7 @@ void LLPanelCameraZoom::onZoomMinusHeldDown()
void LLPanelCameraZoom::onSliderValueChanged()
{
F32 zoom_level = mSlider->getValueF32();
- gAgent.setCameraZoomFraction(zoom_level);
+ gAgentCamera.setCameraZoomFraction(zoom_level);
}
void activate_camera_tool()
@@ -146,7 +146,7 @@ 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;
}
@@ -265,7 +265,7 @@ 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;
}
@@ -421,7 +421,7 @@ void LLFloaterCamera::updateCameraPresetButtons()
childSetValue("rear_view", preset == CAMERA_PRESET_REAR_VIEW);
childSetValue("group_view", preset == CAMERA_PRESET_GROUP_VIEW);
childSetValue("front_view", preset == CAMERA_PRESET_FRONT_VIEW);
- childSetValue("mouselook_view", gAgent.cameraMouselook());
+ childSetValue("mouselook_view", gAgentCamera.cameraMouselook());
}
void LLFloaterCamera::onClickCameraPresets(const LLSD& param)
@@ -430,19 +430,19 @@ void LLFloaterCamera::onClickCameraPresets(const LLSD& param)
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)
{
- gAgent.changeCameraToMouselook();
+ gAgentCamera.changeCameraToMouselook();
}
LLFloaterCamera* camera_floater = LLFloaterCamera::findInstance();
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
index 97ebab3425..f6cffd4b14 100644
--- a/indra/newview/llfloaterevent.cpp
+++ b/indra/newview/llfloaterevent.cpp
@@ -113,7 +113,6 @@ BOOL LLFloaterEvent::postBuild()
mTBDuration = getChild<LLTextBox>("event_duration");
mTBDesc = getChild<LLExpandableTextBox>("event_desc");
- mTBDesc->setEnabled(FALSE);
mTBRunBy = getChild<LLTextBox>("event_runby");
mTBLocation = getChild<LLTextBox>("event_location");
@@ -193,7 +192,7 @@ void LLFloaterEvent::processEventInfoReply(LLMessageSystem *msg, void **)
floater->mTBCategory->setText(floater->mEventInfo.mCategoryStr);
floater->mTBDate->setText(floater->mEventInfo.mTimeStr);
floater->mTBDesc->setText(floater->mEventInfo.mDesc);
- floater->mTBRunBy->setText(LLSLURL::buildCommand("agent", floater->mEventInfo.mRunByID, "inspect"));
+ floater->mTBRunBy->setText(LLSLURL("agent", floater->mEventInfo.mRunByID, "inspect").getSLURLString());
floater->mTBDuration->setText(llformat("%d:%.2d", floater->mEventInfo.mDuration / 60, floater->mEventInfo.mDuration % 60));
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index 9c1ac2631d..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,11 +199,12 @@ 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);
+ setFetchIDs(folders);
+ startFetch();
if (mGestureList)
{
@@ -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,17 +424,17 @@ 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));
+ LLGestureMgr::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id));
LLViewerInventoryItem *item = gInventory.getItem(item_id);
llassert(item);
if (item)
{
- LLGestureManager::instance().activateGestureWithAsset(item_id, item->getAssetUUID(), inform_server, deactivate_similar);
+ LLGestureMgr::instance().activateGestureWithAsset(item_id, item->getAssetUUID(), inform_server, deactivate_similar);
LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL;
}
}
@@ -451,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() )
@@ -468,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)
{
@@ -494,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)
@@ -558,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);
@@ -572,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);
@@ -610,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);
}
@@ -623,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 eb56f387cd..bd07cfdfbf 100644
--- a/indra/newview/llfloatergodtools.cpp
+++ b/indra/newview/llfloatergodtools.cpp
@@ -828,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));
}
@@ -846,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);
@@ -963,6 +922,7 @@ LLPanelObjectTools::~LLPanelObjectTools()
BOOL LLPanelObjectTools::postBuild()
{
+ refresh();
return TRUE;
}
@@ -1191,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/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 9917593c91..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)
{
@@ -809,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 844f0ac509..4bffd41d29 100644
--- a/indra/newview/llfloaterinventory.cpp
+++ b/indra/newview/llfloaterinventory.cpp
@@ -34,7 +34,7 @@
#include "llfloaterinventory.h"
-#include "llagent.h"
+#include "llagentcamera.h"
//#include "llfirstuse.h"
#include "llfloaterreg.h"
#include "llinventorymodel.h"
@@ -64,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)
@@ -115,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..473d2b189d 100644
--- a/indra/newview/llfloaterinventory.h
+++ b/indra/newview/llfloaterinventory.h
@@ -63,13 +63,9 @@ 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();
private:
LLPanelMainInventory* mPanelMainInventory;
};
diff --git a/indra/newview/llfloaterlagmeter.cpp b/indra/newview/llfloaterlagmeter.cpp
index 85186cee6b..100cbdb217 100644
--- a/indra/newview/llfloaterlagmeter.cpp
+++ b/indra/newview/llfloaterlagmeter.cpp
@@ -206,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();
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 26a179074d..abdb55ec17 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"
@@ -91,6 +90,7 @@ 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;
@@ -646,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)
@@ -804,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())
@@ -816,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())
+ if (parcel->getForSale())
{
- std::string name;
- name = LLSLURL::buildCommand("agent", auth_buyer_id, "inspect");
- mSaleInfoForSale2->setTextArg("[BUYER]", name);
- }
- else
- {
- 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"));
+ }
}
}
@@ -972,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);
}
@@ -1003,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;
}
@@ -1609,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;
@@ -2771,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())
{
@@ -2816,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())
{
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..725fc17136 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"
@@ -196,7 +196,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 +215,34 @@ void LLFloaterMap::draw()
LLFloater::draw();
}
+// virtual
+void LLFloaterMap::onFocusReceived()
+{
+ setBackgroundOpaque(true);
+ LLPanel::onFocusReceived();
+}
+
+// virtual
+void LLFloaterMap::onFocusLost()
+{
+ setBackgroundOpaque(false);
+ LLPanel::onFocusLost();
+}
+
void LLFloaterMap::reshape(S32 width, S32 height, BOOL called_from_parent)
{
LLFloater::reshape(width, height, called_from_parent);
+
+ //fix for ext-7112
+ //by default ctrl can't overlap caption area
+ if(mMap)
+ {
+ LLRect map_rect;
+ map_rect.setLeftTopAndSize( 0, getRect().getHeight(), width, height);
+ mMap->reshape( width, height, 1);
+ mMap->setRect(map_rect);
+ }
+
updateMinorDirections();
}
diff --git a/indra/newview/llfloatermap.h b/indra/newview/llfloatermap.h
index 6c9138c6a7..9ff2f03180 100644
--- a/indra/newview/llfloatermap.h
+++ b/indra/newview/llfloatermap.h
@@ -53,6 +53,8 @@ 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);
diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp
index 159ce41b79..5c343ecb22 100644
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -169,16 +169,14 @@ void LLFloaterNameDesc::onBtnOK( )
{
childDisable("ok_btn"); // don't allow inadvertent extra uploads
- LLAssetStorage::LLStoreAssetCallback callback = NULL;
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass).
- void *nruserdata = NULL;
std::string display_name = LLStringUtil::null;
upload_new_resource(mFilenameAndPath, // file
childGetValue("name_form").asString(),
childGetValue("description_form").asString(),
- 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
+ LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
- display_name, callback, expected_upload_cost, nruserdata);
+ display_name, NULL, expected_upload_cost);
closeFloater(false);
}
diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp
index b744bff084..105d7f9201 100644
--- a/indra/newview/llfloaternotificationsconsole.cpp
+++ b/indra/newview/llfloaternotificationsconsole.cpp
@@ -184,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");
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/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 8bffe9bf57..0eeef0039c 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -107,9 +107,14 @@
#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;
+//control value for middle mouse as talk2push button
+const static std::string MIDDLE_MOUSE_CV = "MiddleMouse";
+
class LLVoiceSetKeyDialog : public LLModalDialog
{
public:
@@ -179,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);
@@ -188,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();
@@ -225,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);
@@ -326,8 +311,6 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
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()
@@ -343,8 +326,6 @@ BOOL LLFloaterPreference::postBuild()
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);
@@ -426,17 +407,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());
@@ -525,13 +503,15 @@ void LLFloaterPreference::onOpen(const LLSD& key)
// if they're not adult or a god, they shouldn't see the adult selection, so delete it
if (!gAgent.isAdult() && !gAgent.isGodlike())
{
- // 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
{
@@ -619,7 +599,7 @@ void LLFloaterPreference::onBtnOK()
llinfos << "Can't close preferences!" << llendl;
}
- LLPanelLogin::refreshLocation( false );
+ LLPanelLogin::updateLocationCombo( false );
}
// static
@@ -636,7 +616,7 @@ void LLFloaterPreference::onBtnApply( )
apply();
saveSettings();
- LLPanelLogin::refreshLocation( false );
+ LLPanelLogin::updateLocationCombo( false );
}
// static
@@ -880,6 +860,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()
@@ -1008,9 +990,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()
@@ -1093,10 +1083,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)
@@ -1209,7 +1197,7 @@ void LLFloaterPreference::applyResolution()
gSavedSettings.setS32("FullScreenWidth", supported_resolutions[resIndex].mWidth);
gSavedSettings.setS32("FullScreenHeight", supported_resolutions[resIndex].mHeight);
- gViewerWindow->requestResolutionUpdate(gSavedSettings.getBOOL("WindowFullScreen"));
+ gViewerWindow->requestResolutionUpdate(gSavedSettings.getBOOL("FullScreen"));
send_agent_update(TRUE);
@@ -1302,6 +1290,16 @@ BOOL LLPanelPreference::postBuild()
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/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
index 5c0593ad29..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"
@@ -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);
}
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 122bdc8bc7..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);
}
@@ -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)
@@ -754,7 +788,7 @@ void LLPanelScriptLimitsRegionMemory::setRegionSummary(LLSD content)
}
else
{
- llinfos << "summary doesn't contain memory info" << llendl;
+ llwarns << "summary doesn't contain memory info" << llendl;
return;
}
@@ -772,7 +806,7 @@ void LLPanelScriptLimitsRegionMemory::setRegionSummary(LLSD content)
}
else
{
- llinfos << "summary doesn't contain urls info" << llendl;
+ llwarns << "summary doesn't contain urls info" << llendl;
return;
}
@@ -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()
@@ -1218,7 +1261,7 @@ void LLPanelScriptLimitsAttachment::setAttachmentSummary(LLSD content)
}
else
{
- llinfos << "attachment details don't contain memory summary info" << llendl;
+ llwarns << "attachment details don't contain memory summary info" << llendl;
return;
}
@@ -1236,7 +1279,7 @@ void LLPanelScriptLimitsAttachment::setAttachmentSummary(LLSD content)
}
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 0cba4d72f2..3c32b9f701 100644
--- a/indra/newview/llfloaterscriptlimits.h
+++ b/indra/newview/llfloaterscriptlimits.h
@@ -153,10 +153,7 @@ public:
mParcelMemoryMax(0),
mParcelMemoryUsed(0) {};
- ~LLPanelScriptLimitsRegionMemory()
- {
- LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelId, this);
- };
+ ~LLPanelScriptLimitsRegionMemory();
// LLPanel
virtual BOOL postBuild();
diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp
index eae6121e79..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
@@ -391,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();
@@ -423,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..b9008fa53b 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -38,28 +38,34 @@
// Viewer includes
#include "llagent.h"
-#include "llcallbacklist.h"
-#include "llcriticaldamp.h"
-#include "llui.h"
-#include "llfocusmgr.h"
+#include "llagentcamera.h"
+#include "llagentui.h"
+#include "llavatarpropertiesprocessor.h"
+#include "llbottomtray.h"
#include "llbutton.h"
+#include "llcallbacklist.h"
+#include "llcheckboxctrl.h"
#include "llcombobox.h"
+#include "llcriticaldamp.h"
#include "lleconomy.h"
+#include "llfloaterpostcard.h"
+#include "llfocusmgr.h"
+#include "lllandmarkactions.h"
+#include "llradiogroup.h"
#include "llsliderctrl.h"
+#include "llslurl.h"
#include "llspinctrl.h"
-#include "llviewercontrol.h"
+#include "lltoolfocus.h"
+#include "lltoolmgr.h"
+#include "llui.h"
#include "lluictrlfactory.h"
-#include "llviewerstats.h"
#include "llviewercamera.h"
-#include "llviewerwindow.h"
+#include "llviewercontrol.h"
#include "llviewermenufile.h" // upload_new_resource()
-#include "llfloaterpostcard.h"
-#include "llcheckboxctrl.h"
-#include "llradiogroup.h"
-#include "lltoolfocus.h"
-#include "lltoolmgr.h"
+#include "llviewerstats.h"
+#include "llviewerwindow.h"
+#include "llweb.h"
#include "llworld.h"
-#include "llagentui.h"
// Linden library includes
#include "llfontgl.h"
@@ -113,6 +119,7 @@ public:
enum ESnapshotType
{
SNAPSHOT_POSTCARD,
+ SNAPSHOT_WEB,
SNAPSHOT_TEXTURE,
SNAPSHOT_LOCAL
};
@@ -161,8 +168,11 @@ public:
void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; }
void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f);
LLFloaterPostcard* savePostcard();
- void saveTexture();
+ void confirmSavingTexture(bool set_as_profile_pic = false);
+ bool onSavingTextureConfirmed(const LLSD& notification, const LLSD& response, bool set_as_profile_pic);
+ void saveTexture(bool set_as_profile_pic = false);
BOOL saveLocal();
+ void saveWeb(std::string url);
BOOL setThumbnailImageSize() ;
void generateThumbnailImage(BOOL force_update = FALSE) ;
@@ -171,6 +181,9 @@ public:
// Returns TRUE when snapshot generated, FALSE otherwise.
static BOOL onIdle( void* snapshot_preview );
+
+ // callback for region name resolve
+ void regionNameCallback(std::string url, LLSD body, const std::string& name, S32 x, S32 y, S32 z);
private:
LLColor4 mColor;
@@ -292,7 +305,7 @@ F32 LLSnapshotLivePreview::getAspect()
F32 image_aspect_ratio = ((F32)mWidth[mCurImageIndex]) / ((F32)mHeight[mCurImageIndex]);
F32 window_aspect_ratio = ((F32)getRect().getWidth()) / ((F32)getRect().getHeight());
- if (!mKeepAspectRatio)//gSavedSettings.getBOOL("KeepAspectForSnapshot"))
+ if (!mKeepAspectRatio)
{
return image_aspect_ratio;
}
@@ -625,20 +638,20 @@ BOOL LLSnapshotLivePreview::setThumbnailImageSize()
F32 window_aspect_ratio = ((F32)window_width) / ((F32)window_height);
// UI size for thumbnail
- S32 max_width = LLFloaterSnapshot::getUIWinWidth() - 20;
- S32 max_height = 90;
+ LLFloater* floater = LLFloaterReg::getInstance("snapshot");
+ mThumbnailWidth = floater->getChild<LLView>("thumbnail_placeholder")->getRect().getWidth();
+ mThumbnailHeight = floater->getChild<LLView>("thumbnail_placeholder")->getRect().getHeight();
+
- if (window_aspect_ratio > (F32)max_width / max_height)
+ if (window_aspect_ratio > (F32)mThumbnailWidth / mThumbnailHeight)
{
// image too wide, shrink to width
- mThumbnailWidth = max_width;
- mThumbnailHeight = llround((F32)max_width / window_aspect_ratio);
+ mThumbnailHeight = llround((F32)mThumbnailWidth / window_aspect_ratio);
}
else
{
// image too tall, shrink to height
- mThumbnailHeight = max_height;
- mThumbnailWidth = llround((F32)max_height * window_aspect_ratio);
+ mThumbnailWidth = llround((F32)mThumbnailHeight * window_aspect_ratio);
}
if(mThumbnailWidth > window_width || mThumbnailHeight > window_height)
@@ -824,10 +837,21 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
{
// delete any existing image
previewp->mFormattedImage = NULL;
+
// now create the new one of the appropriate format.
- // note: postcards hardcoded to use jpeg always.
- LLFloaterSnapshot::ESnapshotFormat format = previewp->getSnapshotType() == SNAPSHOT_POSTCARD
- ? LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG : previewp->getSnapshotFormat();
+ // note: postcards and web hardcoded to use jpeg always.
+ LLFloaterSnapshot::ESnapshotFormat format;
+
+ if (previewp->getSnapshotType() == SNAPSHOT_POSTCARD ||
+ previewp->getSnapshotType() == SNAPSHOT_WEB)
+ {
+ format = LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG;
+ }
+ else
+ {
+ format = previewp->getSnapshotFormat();
+ }
+
switch(format)
{
case LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG:
@@ -892,7 +916,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
}
}
@@ -954,13 +978,41 @@ LLFloaterPostcard* LLSnapshotLivePreview::savePostcard()
return floater;
}
-void LLSnapshotLivePreview::saveTexture()
+// Callback for asset upload
+void profile_pic_upload_callback(const LLUUID& uuid)
+{
+ LLFloaterSnapshot* floater = LLFloaterReg::getTypedInstance<LLFloaterSnapshot>("snapshot");
+ floater->setAsProfilePic(uuid);
+}
+
+void LLSnapshotLivePreview::confirmSavingTexture(bool set_as_profile_pic)
+{
+ LLSD args;
+ args["AMOUNT"] = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ LLNotificationsUtil::add("UploadConfirmation", args, LLSD(),
+ boost::bind(&LLSnapshotLivePreview::onSavingTextureConfirmed, this, _1, _2, set_as_profile_pic));
+}
+
+bool LLSnapshotLivePreview::onSavingTextureConfirmed(const LLSD& notification, const LLSD& response, bool set_as_profile_pic)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ if (option == 0)
+ {
+ saveTexture(set_as_profile_pic);
+ }
+
+ return false;
+}
+
+
+void LLSnapshotLivePreview::saveTexture(bool set_as_profile_pic)
{
// gen a new uuid for this asset
LLTransactionID tid;
tid.generate();
LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
-
+
LLPointer<LLImageJ2C> formatted = new LLImageJ2C;
LLPointer<LLImageRaw> scaled = new LLImageRaw(mPreviewImage->getData(),
mPreviewImage->getWidth(),
@@ -971,26 +1023,30 @@ void LLSnapshotLivePreview::saveTexture()
if (formatted->encode(scaled, 0.0f))
{
+ boost::function<void(const LLUUID& uuid)> callback = NULL;
+
+ if (set_as_profile_pic)
+ {
+ callback = profile_pic_upload_callback;
+ }
+
LLVFile::writeFile(formatted->getData(), formatted->getDataSize(), gVFS, new_asset_id, LLAssetType::AT_TEXTURE);
std::string pos_string;
LLAgentUI::buildLocationString(pos_string, LLAgentUI::LOCATION_FORMAT_FULL);
std::string who_took_it;
LLAgentUI::buildFullname(who_took_it);
- LLAssetStorage::LLStoreAssetCallback callback = NULL;
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
- void *userdata = NULL;
upload_new_resource(tid, // tid
LLAssetType::AT_TEXTURE,
"Snapshot : " + pos_string,
"Taken by " + who_took_it + " at " + pos_string,
- 0,
LLFolderType::FT_SNAPSHOT_CATEGORY,
LLInventoryType::IT_SNAPSHOT,
PERM_ALL, // Note: Snapshots to inventory is a special case of content upload
PERM_NONE, // that ignores the user's premissions preferences and continues to
PERM_NONE, // always use these fairly permissive hard-coded initial perms. - MG
"Snapshot : " + pos_string,
- callback, expected_upload_cost, userdata);
+ callback, expected_upload_cost);
gViewerWindow->playSnapshotAnimAndSound();
}
else
@@ -1020,6 +1076,81 @@ BOOL LLSnapshotLivePreview::saveLocal()
return success;
}
+
+class LLSendWebResponder : public LLHTTPClient::Responder
+{
+public:
+
+ virtual void error(U32 status, const std::string& reason)
+ {
+ llwarns << status << ": " << reason << llendl;
+ LLNotificationsUtil::add("ShareToWebFailed");
+ }
+
+ virtual void result(const LLSD& content)
+ {
+ std::string response_url = content["response_url"].asString();
+
+ if (!response_url.empty())
+ {
+ LLWeb::loadURLExternal(response_url);
+ }
+ else
+ {
+ LLNotificationsUtil::add("ShareToWebFailed");
+ }
+ }
+
+};
+
+void LLSnapshotLivePreview::saveWeb(std::string url)
+{
+ if (url.empty())
+ {
+ llwarns << "No share to web url" << llendl;
+ return;
+ }
+
+ LLImageJPEG* jpg = dynamic_cast<LLImageJPEG*>(mFormattedImage.get());
+ if(!jpg)
+ {
+ llwarns << "Formatted image not a JPEG" << llendl;
+ return;
+ }
+
+/* figure out if there's a better way to serialize */
+ LLSD body;
+ std::vector<U8> binary_image;
+ U8* data = jpg->getData();
+ for (int i = 0; i < jpg->getDataSize(); i++)
+ {
+ binary_image.push_back(data[i]);
+ }
+
+ body["image"] = binary_image;
+
+ body["description"] = getChild<LLLineEditor>("description")->getText();
+
+ std::string name;
+ LLAgentUI::buildFullname(name);
+
+ body["avatar_name"] = name;
+
+ LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(gAgentCamera.getCameraPositionGlobal(),
+ boost::bind(&LLSnapshotLivePreview::regionNameCallback, this, url, body, _1, _2, _3, _4));
+
+ gViewerWindow->playSnapshotAnimAndSound();
+}
+
+
+void LLSnapshotLivePreview::regionNameCallback(std::string url, LLSD body, const std::string& name, S32 x, S32 y, S32 z)
+{
+ body["slurl"] = LLSLURL(name, LLVector3d(x, y, z)).getSLURLString();
+
+ LLHTTPClient::post(url, body,
+ new LLSendWebResponder());
+}
+
///----------------------------------------------------------------------------
/// Class LLFloaterSnapshot::Impl
///----------------------------------------------------------------------------
@@ -1039,9 +1170,6 @@ public:
mAvatarPauseHandles.clear();
}
- static void onClickDiscard(void* data);
- static void onClickKeep(void* data);
- static void onCommitSave(LLUICtrl* ctrl, void* data);
static void onClickNewSnapshot(void* data);
static void onClickAutoSnap(LLUICtrl *ctrl, void* data);
//static void onClickAdvanceSnap(LLUICtrl *ctrl, void* data);
@@ -1056,9 +1184,11 @@ public:
static void updateResolution(LLUICtrl* ctrl, void* data, BOOL do_update = TRUE);
static void onCommitFreezeFrame(LLUICtrl* ctrl, void* data);
static void onCommitLayerTypes(LLUICtrl* ctrl, void*data);
- static void onCommitSnapshotType(LLUICtrl* ctrl, void* data);
static void onCommitSnapshotFormat(LLUICtrl* ctrl, void* data);
static void onCommitCustomResolution(LLUICtrl *ctrl, void* data);
+ static void onCommitSnapshot(LLFloaterSnapshot* view, LLSnapshotLivePreview::ESnapshotType type);
+ static void onCommitProfilePic(LLFloaterSnapshot* view);
+ static void onToggleAdvanced(LLUICtrl *ctrl, void* data);
static void resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height) ;
static BOOL checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL isWidthChanged, S32 max_value);
@@ -1066,10 +1196,8 @@ public:
static void setResolution(LLFloaterSnapshot* floater, const std::string& comboname);
static void updateControls(LLFloaterSnapshot* floater);
static void updateLayout(LLFloaterSnapshot* floater);
- static void updateResolutionTextEntry(LLFloaterSnapshot* floater);
private:
- static LLSnapshotLivePreview::ESnapshotType getTypeIndex(LLFloaterSnapshot* floater);
static ESnapshotFormat getFormatIndex(LLFloaterSnapshot* floater);
static LLViewerWindow::ESnapshotType getLayerType(LLFloaterSnapshot* floater);
static void comboSetCustom(LLFloaterSnapshot *floater, const std::string& comboname);
@@ -1092,22 +1220,6 @@ LLSnapshotLivePreview* LLFloaterSnapshot::Impl::getPreviewView(LLFloaterSnapshot
}
// static
-LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getTypeIndex(LLFloaterSnapshot* floater)
-{
- LLSnapshotLivePreview::ESnapshotType index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD;
- LLSD value = floater->childGetValue("snapshot_type_radio");
- const std::string id = value.asString();
- if (id == "postcard")
- index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD;
- else if (id == "texture")
- index = LLSnapshotLivePreview::SNAPSHOT_TEXTURE;
- else if (id == "local")
- index = LLSnapshotLivePreview::SNAPSHOT_LOCAL;
- return index;
-}
-
-
-// static
LLFloaterSnapshot::ESnapshotFormat LLFloaterSnapshot::Impl::getFormatIndex(LLFloaterSnapshot* floater)
{
ESnapshotFormat index = SNAPSHOT_FORMAT_PNG;
@@ -1155,20 +1267,12 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
{
LLSnapshotLivePreview* previewp = getPreviewView(floaterp);
- S32 delta_height = gSavedSettings.getBOOL("AdvanceSnapshot") ? 0 : floaterp->getUIWinHeightShort() - floaterp->getUIWinHeightLong() ;
-
if(!gSavedSettings.getBOOL("AdvanceSnapshot")) //set to original window resolution
{
previewp->mKeepAspectRatio = TRUE;
- floaterp->getChild<LLComboBox>("postcard_size_combo")->setCurrentByIndex(0);
- gSavedSettings.setS32("SnapshotPostcardLastResolution", 0);
-
- floaterp->getChild<LLComboBox>("texture_size_combo")->setCurrentByIndex(0);
- gSavedSettings.setS32("SnapshotTextureLastResolution", 0);
-
- floaterp->getChild<LLComboBox>("local_size_combo")->setCurrentByIndex(0);
- gSavedSettings.setS32("SnapshotLocalLastResolution", 0);
+ floaterp->getChild<LLComboBox>("snapshot_size_combo")->setCurrentByIndex(0);
+ gSavedSettings.setS32("SnapshotLastResolution", 0);
LLSnapshotLivePreview* previewp = getPreviewView(floaterp);
previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
@@ -1181,9 +1285,6 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
// stop all mouse events at fullscreen preview layer
floaterp->getParent()->setMouseOpaque(TRUE);
- // shrink to smaller layout
- floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height);
-
// can see and interact with fullscreen preview now
if (previewp)
{
@@ -1212,7 +1313,6 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
else // turning off freeze frame mode
{
floaterp->getParent()->setMouseOpaque(FALSE);
- floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height);
if (previewp)
{
previewp->setVisible(FALSE);
@@ -1241,127 +1341,27 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
// static
void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
{
- LLRadioGroup* snapshot_type_radio = floater->getChild<LLRadioGroup>("snapshot_type_radio");
- snapshot_type_radio->setSelectedIndex(gSavedSettings.getS32("LastSnapshotType"));
- LLSnapshotLivePreview::ESnapshotType shot_type = getTypeIndex(floater);
- ESnapshotFormat shot_format = (ESnapshotFormat)gSavedSettings.getS32("SnapshotFormat"); //getFormatIndex(floater); LLViewerWindow::ESnapshotType layer_type = getLayerType(floater);
- LLViewerWindow::ESnapshotType layer_type = getLayerType(floater);
-
- floater->childSetVisible("postcard_size_combo", FALSE);
- floater->childSetVisible("texture_size_combo", FALSE);
- floater->childSetVisible("local_size_combo", FALSE);
-
- floater->getChild<LLComboBox>("postcard_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotPostcardLastResolution"));
- floater->getChild<LLComboBox>("texture_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotTextureLastResolution"));
- floater->getChild<LLComboBox>("local_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotLocalLastResolution"));
- floater->getChild<LLComboBox>("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat"));
-
- floater->childSetVisible("upload_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE);
- floater->childSetVisible("send_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD);
- floater->childSetVisible("save_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL);
- floater->childSetEnabled("keep_aspect_check", shot_type != LLSnapshotLivePreview::SNAPSHOT_TEXTURE && !floater->impl.mAspectRatioCheckOff);
- floater->childSetEnabled("layer_types", shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL);
-
- BOOL is_advance = gSavedSettings.getBOOL("AdvanceSnapshot");
- BOOL is_local = shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL;
- BOOL show_slider =
- shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD
- || (is_local && shot_format == LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG);
-
- floater->childSetVisible("more_btn", !is_advance); // the only item hidden in advanced mode
- floater->childSetVisible("less_btn", is_advance);
- floater->childSetVisible("type_label2", is_advance);
- floater->childSetVisible("format_label", is_advance && is_local);
- floater->childSetVisible("local_format_combo", is_advance && is_local);
- floater->childSetVisible("layer_types", is_advance);
- floater->childSetVisible("layer_type_label", is_advance);
- floater->childSetVisible("snapshot_width", is_advance);
- floater->childSetVisible("snapshot_height", is_advance);
- floater->childSetVisible("keep_aspect_check", is_advance);
- floater->childSetVisible("ui_check", is_advance);
- floater->childSetVisible("hud_check", is_advance);
- floater->childSetVisible("keep_open_check", is_advance);
- floater->childSetVisible("freeze_frame_check", is_advance);
- floater->childSetVisible("auto_snapshot_check", is_advance);
- floater->childSetVisible("image_quality_slider", is_advance && show_slider);
-
LLSnapshotLivePreview* previewp = getPreviewView(floater);
- BOOL got_bytes = previewp && previewp->getDataSize() > 0;
- BOOL got_snap = previewp && previewp->getSnapshotUpToDate();
-
- floater->childSetEnabled("send_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD && got_snap && previewp->getDataSize() <= MAX_POSTCARD_DATASIZE);
- floater->childSetEnabled("upload_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE && got_snap);
- floater->childSetEnabled("save_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL && got_snap);
-
- LLLocale locale(LLLocale::USER_LOCALE);
- std::string bytes_string;
- if (got_snap)
- {
- LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 );
- }
- S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
- floater->childSetLabelArg("texture", "[AMOUNT]", llformat("%d",upload_cost));
- floater->childSetLabelArg("upload_btn", "[AMOUNT]", llformat("%d",upload_cost));
- floater->childSetTextArg("file_size_label", "[SIZE]", got_snap ? bytes_string : floater->getString("unknown"));
- floater->childSetColor("file_size_label",
- shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD
- && got_bytes
- && previewp->getDataSize() > MAX_POSTCARD_DATASIZE ? LLUIColor(LLColor4::red) : LLUIColorTable::instance().getColor( "LabelTextColor" ));
-
- switch(shot_type)
- {
- case LLSnapshotLivePreview::SNAPSHOT_POSTCARD:
- layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR;
- floater->childSetValue("layer_types", "colors");
- if(is_advance)
- {
- setResolution(floater, "postcard_size_combo");
- }
- break;
- case LLSnapshotLivePreview::SNAPSHOT_TEXTURE:
- layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR;
- floater->childSetValue("layer_types", "colors");
- if(is_advance)
- {
- setResolution(floater, "texture_size_combo");
- }
- break;
- case LLSnapshotLivePreview::SNAPSHOT_LOCAL:
- if(is_advance)
- {
- setResolution(floater, "local_size_combo");
- }
- break;
- default:
- break;
+ if (NULL == previewp)
+ {
+ return;
}
- updateResolutionTextEntry(floater);
+ // Disable buttons until Snapshot is ready. EXT-6534
+ BOOL got_snap = previewp->getSnapshotUpToDate();
- if (previewp)
- {
- previewp->setSnapshotType(shot_type);
- previewp->setSnapshotFormat(shot_format);
- previewp->setSnapshotBufferType(layer_type);
- }
-}
+ // process Main buttons
+ floater->childSetEnabled("share", got_snap);
+ floater->childSetEnabled("save", got_snap);
+ floater->childSetEnabled("set_profile_pic", got_snap);
-// static
-void LLFloaterSnapshot::Impl::updateResolutionTextEntry(LLFloaterSnapshot* floater)
-{
- LLSpinCtrl* width_spinner = floater->getChild<LLSpinCtrl>("snapshot_width");
- LLSpinCtrl* height_spinner = floater->getChild<LLSpinCtrl>("snapshot_height");
+ // process Share actions buttons
+ floater->childSetEnabled("share_to_web", got_snap);
+ floater->childSetEnabled("share_to_email", got_snap);
- if(getTypeIndex(floater) == LLSnapshotLivePreview::SNAPSHOT_TEXTURE)
- {
- width_spinner->setAllowEdit(FALSE);
- height_spinner->setAllowEdit(FALSE);
- }
- else
- {
- width_spinner->setAllowEdit(TRUE);
- height_spinner->setAllowEdit(TRUE);
- }
+ // process Save actions buttons
+ floater->childSetEnabled("save_to_inventory", got_snap);
+ floater->childSetEnabled("save_to_computer", got_snap);
}
// static
@@ -1375,70 +1375,6 @@ void LLFloaterSnapshot::Impl::checkAutoSnapshot(LLSnapshotLivePreview* previewp,
}
// static
-void LLFloaterSnapshot::Impl::onClickDiscard(void* data)
-{
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
-
- if (view)
- {
- view->closeFloater();
- }
-}
-
-
-// static
-void LLFloaterSnapshot::Impl::onCommitSave(LLUICtrl* ctrl, void* data)
-{
- if (ctrl->getValue().asString() == "save as")
- {
- gViewerWindow->resetSnapshotLoc();
- }
- onClickKeep(data);
-}
-
-// static
-void LLFloaterSnapshot::Impl::onClickKeep(void* data)
-{
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
- LLSnapshotLivePreview* previewp = getPreviewView(view);
-
- if (previewp)
- {
- if (previewp->getSnapshotType() == LLSnapshotLivePreview::SNAPSHOT_POSTCARD)
- {
- LLFloaterPostcard* floater = previewp->savePostcard();
- // if still in snapshot mode, put postcard floater in snapshot floaterview
- // and link it to snapshot floater
- if (floater && !gSavedSettings.getBOOL("CloseSnapshotOnKeep"))
- {
- gFloaterView->removeChild(floater);
- gSnapshotFloaterView->addChild(floater);
- view->addDependentFloater(floater, FALSE);
- }
- }
- else if (previewp->getSnapshotType() == LLSnapshotLivePreview::SNAPSHOT_TEXTURE)
- {
- previewp->saveTexture();
- }
- else
- {
- previewp->saveLocal();
- }
-
- if (gSavedSettings.getBOOL("CloseSnapshotOnKeep"))
- {
- view->closeFloater();
- }
- else
- {
- checkAutoSnapshot(previewp);
- }
-
- updateControls(view);
- }
-}
-
-// static
void LLFloaterSnapshot::Impl::onClickNewSnapshot(void* data)
{
LLSnapshotLivePreview* previewp = getPreviewView((LLFloaterSnapshot *)data);
@@ -1674,10 +1610,8 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL
}
// save off all selected resolution values
- gSavedSettings.setS32("SnapshotPostcardLastResolution", view->getChild<LLComboBox>("postcard_size_combo")->getCurrentIndex());
- gSavedSettings.setS32("SnapshotTextureLastResolution", view->getChild<LLComboBox>("texture_size_combo")->getCurrentIndex());
- gSavedSettings.setS32("SnapshotLocalLastResolution", view->getChild<LLComboBox>("local_size_combo")->getCurrentIndex());
-
+ gSavedSettings.setS32("SnapshotLastResolution", view->getChild<LLComboBox>("snapshot_size_combo")->getCurrentIndex());
+
std::string sdstring = combobox->getSelectedValue();
LLSD sdres;
std::stringstream sstream(sdstring);
@@ -1757,17 +1691,130 @@ void LLFloaterSnapshot::Impl::onCommitLayerTypes(LLUICtrl* ctrl, void*data)
}
//static
-void LLFloaterSnapshot::Impl::onCommitSnapshotType(LLUICtrl* ctrl, void* data)
+void LLFloaterSnapshot::Impl::onToggleAdvanced(LLUICtrl* ctrl, void* data)
{
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
- if (view)
+ LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
+
+ LLPanel* advanced_panel = view->getChild<LLPanel>("snapshot_advanced");
+
+ if (advanced_panel->getVisible())
{
- gSavedSettings.setS32("LastSnapshotType", getTypeIndex(view));
- getPreviewView(view)->updateSnapshot(TRUE);
- updateControls(view);
+ advanced_panel->setVisible(false);
+
+ // shrink floater back to original size
+ view->reshape(view->getRect().getWidth() - advanced_panel->getRect().getWidth(), view->getRect().getHeight());
+
+ view->getChild<LLButton>("hide_advanced")->setVisible(false);
+ view->getChild<LLButton>("show_advanced")->setVisible(true);
+ }
+ else
+ {
+ advanced_panel->setVisible(true);
+ // stretch the floater so it can accommodate the advanced panel
+ view->reshape(view->getRect().getWidth() + advanced_panel->getRect().getWidth(), view->getRect().getHeight());
+
+ view->getChild<LLButton>("hide_advanced")->setVisible(true);
+ view->getChild<LLButton>("show_advanced")->setVisible(false);
}
}
+// This object represents a pending request for avatar properties information
+class LLAvatarDataRequest : public LLAvatarPropertiesObserver
+{
+public:
+ LLAvatarDataRequest(const LLUUID& avatar_id, const LLUUID& image_id, LLFloaterSnapshot* floater)
+ : mAvatarID(avatar_id),
+ mImageID(image_id),
+ mSnapshotFloater(floater)
+
+ {
+ }
+
+ ~LLAvatarDataRequest()
+ {
+ // remove ourselves as an observer
+ LLAvatarPropertiesProcessor::getInstance()->
+ removeObserver(mAvatarID, this);
+ }
+
+ void processProperties(void* data, EAvatarProcessorType type)
+ {
+ // route the data to the inspector
+ if (data
+ && type == APT_PROPERTIES)
+ {
+
+ LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data);
+
+ LLAvatarData new_data(*avatar_data);
+ new_data.image_id = mImageID;
+
+ LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate(&new_data);
+
+ delete this;
+ }
+ }
+
+ // Store avatar ID so we can un-register the observer on destruction
+ LLUUID mAvatarID;
+ LLUUID mImageID;
+ LLFloaterSnapshot* mSnapshotFloater;
+};
+
+void LLFloaterSnapshot::Impl::onCommitProfilePic(LLFloaterSnapshot* view)
+{
+ //first save to harddrive
+ LLSnapshotLivePreview* previewp = getPreviewView(view);
+
+ if(previewp)
+ {
+ previewp->confirmSavingTexture(true);
+ }
+}
+
+void LLFloaterSnapshot::Impl::onCommitSnapshot(LLFloaterSnapshot* view, LLSnapshotLivePreview::ESnapshotType type)
+{
+ LLSnapshotLivePreview* previewp = getPreviewView(view);
+
+ if (previewp)
+ {
+ previewp->setSnapshotType(type);
+
+ if (type == LLSnapshotLivePreview::SNAPSHOT_WEB)
+ {
+ previewp->saveWeb(view->getString("share_to_web_url"));
+ }
+ else if (type == LLSnapshotLivePreview::SNAPSHOT_LOCAL)
+ {
+ previewp->saveLocal();
+ }
+ else if (type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE)
+ {
+ previewp->confirmSavingTexture();
+ }
+ else if (type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD)
+ {
+ LLFloaterPostcard* floater = previewp->savePostcard();
+ // if still in snapshot mode, put postcard floater in snapshot floaterview
+ // and link it to snapshot floater
+ if (floater && !gSavedSettings.getBOOL("CloseSnapshotOnKeep"))
+ {
+ gFloaterView->removeChild(floater);
+ gSnapshotFloaterView->addChild(floater);
+ view->addDependentFloater(floater, FALSE);
+ }
+ }
+
+ if (gSavedSettings.getBOOL("CloseSnapshotOnKeep"))
+ {
+ view->closeFloater();
+ }
+ else
+ {
+ checkAutoSnapshot(previewp);
+ }
+ }
+}
//static
void LLFloaterSnapshot::Impl::onCommitSnapshotFormat(LLUICtrl* ctrl, void* data)
@@ -1781,8 +1828,6 @@ void LLFloaterSnapshot::Impl::onCommitSnapshotFormat(LLUICtrl* ctrl, void* data)
}
}
-
-
// Sets the named size combo to "custom" mode.
// static
void LLFloaterSnapshot::Impl::comboSetCustom(LLFloaterSnapshot* floater, const std::string& comboname)
@@ -1791,24 +1836,11 @@ void LLFloaterSnapshot::Impl::comboSetCustom(LLFloaterSnapshot* floater, const s
combo->setCurrentByIndex(combo->getItemCount() - 1); // "custom" is always the last index
- if(comboname == "postcard_size_combo")
- {
- gSavedSettings.setS32("SnapshotPostcardLastResolution", combo->getCurrentIndex());
- }
- else if(comboname == "texture_size_combo")
- {
- gSavedSettings.setS32("SnapshotTextureLastResolution", combo->getCurrentIndex());
- }
- else if(comboname == "local_size_combo")
- {
- gSavedSettings.setS32("SnapshotLocalLastResolution", combo->getCurrentIndex());
- }
+ gSavedSettings.setS32("SnapshotLastResolution", combo->getCurrentIndex());
checkAspectRatio(floater, -1); // -1 means custom
}
-
-
//static
BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL isWidthChanged, S32 max_value)
{
@@ -1949,9 +1981,7 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat
previewp->setSize(w,h);
checkAutoSnapshot(previewp, FALSE);
previewp->updateSnapshot(FALSE, TRUE);
- comboSetCustom(view, "postcard_size_combo");
- comboSetCustom(view, "texture_size_combo");
- comboSetCustom(view, "local_size_combo");
+ comboSetCustom(view, "snapshot_size_combo");
}
}
@@ -1968,7 +1998,7 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat
// Default constructor
LLFloaterSnapshot::LLFloaterSnapshot(const LLSD& key)
- : LLFloater(key),
+ : LLTransientDockableFloater(NULL, true, key),
impl (*(new Impl))
{
//Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_snapshot.xml", FALSE);
@@ -1993,7 +2023,20 @@ LLFloaterSnapshot::~LLFloaterSnapshot()
BOOL LLFloaterSnapshot::postBuild()
{
- childSetCommitCallback("snapshot_type_radio", Impl::onCommitSnapshotType, this);
+
+ getChild<LLButton>("share")->setCommitCallback(boost::bind(&LLFloaterSnapshot::updateButtons, this, SNAPSHOT_SHARE));
+ getChild<LLButton>("save")->setCommitCallback(boost::bind(&LLFloaterSnapshot::updateButtons, this, SNAPSHOT_SAVE));
+ getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterSnapshot::updateButtons, this, SNAPSHOT_MAIN));
+
+ getChild<LLButton>("share_to_web")->setCommitCallback(boost::bind(&Impl::onCommitSnapshot, this, LLSnapshotLivePreview::SNAPSHOT_WEB));
+ getChild<LLButton>("share_to_email")->setCommitCallback(boost::bind(&Impl::onCommitSnapshot, this, LLSnapshotLivePreview::SNAPSHOT_POSTCARD));
+ getChild<LLButton>("save_to_inventory")->setCommitCallback(boost::bind(&Impl::onCommitSnapshot, this, LLSnapshotLivePreview::SNAPSHOT_TEXTURE));
+ getChild<LLButton>("save_to_computer")->setCommitCallback(boost::bind(&Impl::onCommitSnapshot, this, LLSnapshotLivePreview::SNAPSHOT_LOCAL));
+ getChild<LLButton>("set_profile_pic")->setCommitCallback(boost::bind(&Impl::onCommitProfilePic, this));
+
+ childSetCommitCallback("show_advanced", Impl::onToggleAdvanced, this);
+ childSetCommitCallback("hide_advanced", Impl::onToggleAdvanced, this);
+
childSetCommitCallback("local_format_combo", Impl::onCommitSnapshotFormat, this);
childSetAction("new_snapshot_btn", Impl::onClickNewSnapshot, this);
@@ -2001,11 +2044,6 @@ BOOL LLFloaterSnapshot::postBuild()
childSetAction("more_btn", Impl::onClickMore, this);
childSetAction("less_btn", Impl::onClickLess, this);
- childSetAction("upload_btn", Impl::onClickKeep, this);
- childSetAction("send_btn", Impl::onClickKeep, this);
- childSetCommitCallback("save_btn", Impl::onCommitSave, this);
- childSetAction("discard_btn", Impl::onClickDiscard, this);
-
childSetCommitCallback("image_quality_slider", Impl::onCommitQuality, this);
childSetValue("image_quality_slider", gSavedSettings.getS32("SnapshotQuality"));
@@ -2026,7 +2064,6 @@ BOOL LLFloaterSnapshot::postBuild()
childSetCommitCallback("layer_types", Impl::onCommitLayerTypes, this);
childSetValue("layer_types", "colors");
- childSetEnabled("layer_types", FALSE);
childSetValue("snapshot_width", gSavedSettings.getS32(lastSnapshotWidthName()));
childSetValue("snapshot_height", gSavedSettings.getS32(lastSnapshotHeightName()));
@@ -2037,9 +2074,7 @@ BOOL LLFloaterSnapshot::postBuild()
childSetValue("auto_snapshot_check", gSavedSettings.getBOOL("AutoSnapshot"));
childSetCommitCallback("auto_snapshot_check", Impl::onClickAutoSnap, this);
- childSetCommitCallback("postcard_size_combo", Impl::onCommitResolution, this);
- childSetCommitCallback("texture_size_combo", Impl::onCommitResolution, this);
- childSetCommitCallback("local_size_combo", Impl::onCommitResolution, this);
+ childSetCommitCallback("snapshot_size_combo", Impl::onCommitResolution, this);
// create preview window
LLRect full_screen_rect = getRootView()->getRect();
@@ -2060,8 +2095,14 @@ BOOL LLFloaterSnapshot::postBuild()
impl.mPreviewHandle = previewp->getHandle();
impl.updateControls(this);
impl.updateLayout(this);
+
+ //save off the refresh button's rectangle so we can apply offsets with thumbnail resize
+ mRefreshBtnRect = getChild<LLButton>("new_snapshot_btn")->getRect();
+
+ // make sure we share/hide the general buttons
+ updateButtons(SNAPSHOT_MAIN);
- return TRUE;
+ return LLDockableFloater::postBuild();
}
void LLFloaterSnapshot::draw()
@@ -2074,15 +2115,19 @@ void LLFloaterSnapshot::draw()
return;
}
- LLFloater::draw();
+ LLDockableFloater::draw();
+
+ LLButton* refresh_btn = getChild<LLButton>("new_snapshot_btn");
+ // revert the refresh button to original intended position
+ LLRect refresh_rect = mRefreshBtnRect;
if (previewp)
{
if(previewp->getThumbnailImage())
{
- LLRect thumbnail_rect = getChild<LLUICtrl>("thumbnail_placeholder")->getRect();
+ LLRect thumbnail_rect = getChild<LLView>("thumbnail_placeholder")->getRect();
- S32 offset_x = (getRect().getWidth() - previewp->getThumbnailWidth()) / 2 ;
+ S32 offset_x = (thumbnail_rect.getWidth() - previewp->getThumbnailWidth()) / 2 + thumbnail_rect.mLeft;
S32 offset_y = thumbnail_rect.mBottom + (thumbnail_rect.getHeight() - previewp->getThumbnailHeight()) / 2 ;
glMatrixMode(GL_MODELVIEW);
@@ -2091,8 +2136,14 @@ void LLFloaterSnapshot::draw()
previewp->getThumbnailImage(), LLColor4::white);
previewp->drawPreviewRect(offset_x, offset_y) ;
+
+ refresh_rect.translate(offset_x - thumbnail_rect.mLeft, offset_y - thumbnail_rect.mBottom);
}
}
+
+ refresh_btn->setRect(refresh_rect);
+ drawChild(refresh_btn);
+
}
void LLFloaterSnapshot::onOpen(const LLSD& key)
@@ -2106,6 +2157,12 @@ void LLFloaterSnapshot::onOpen(const LLSD& key)
gSnapshotFloaterView->setEnabled(TRUE);
gSnapshotFloaterView->setVisible(TRUE);
gSnapshotFloaterView->adjustToFitScreen(this, FALSE);
+
+ LLButton *snapshots = LLBottomTray::getInstance()->getChild<LLButton>("snapshots");
+
+ setDockControl(new LLDockControl(
+ snapshots, this,
+ getDockTongue(), LLDockControl::TOP));
}
void LLFloaterSnapshot::onClose(bool app_quitting)
@@ -2133,6 +2190,33 @@ void LLFloaterSnapshot::update()
}
}
+bool LLFloaterSnapshot::updateButtons(ESnapshotMode mode)
+{
+ childSetVisible("share", mode == SNAPSHOT_MAIN);
+ childSetVisible("save", mode == SNAPSHOT_MAIN);
+ childSetVisible("set_profile_pic", mode == SNAPSHOT_MAIN);
+
+ childSetVisible("share_to_web", mode == SNAPSHOT_SHARE);
+ childSetVisible("share_to_email", mode == SNAPSHOT_SHARE);
+
+ childSetVisible("save_to_inventory", mode == SNAPSHOT_SAVE);
+ childSetVisible("save_to_computer", mode == SNAPSHOT_SAVE);
+
+ childSetVisible("cancel", mode != SNAPSHOT_MAIN);
+
+ return true;
+}
+
+void LLFloaterSnapshot::setAsProfilePic(const LLUUID& image_id)
+{
+ LLAvatarDataRequest* avatar_data_request = new LLAvatarDataRequest(gAgent.getID(), image_id, this);
+
+ LLAvatarPropertiesProcessor* processor =
+ LLAvatarPropertiesProcessor::getInstance();
+
+ processor->addObserver(gAgent.getID(), avatar_data_request);
+ processor->sendAvatarPropertiesRequest(gAgent.getID());
+}
///----------------------------------------------------------------------------
/// Class LLSnapshotFloaterView
diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h
index 1333497bd2..931d355748 100644
--- a/indra/newview/llfloatersnapshot.h
+++ b/indra/newview/llfloatersnapshot.h
@@ -34,9 +34,10 @@
#define LL_LLFLOATERSNAPSHOT_H
#include "llfloater.h"
+#include "lltransientdockablefloater.h"
-class LLFloaterSnapshot : public LLFloater
+class LLFloaterSnapshot : public LLTransientDockableFloater
{
public:
typedef enum e_snapshot_format
@@ -46,6 +47,13 @@ public:
SNAPSHOT_FORMAT_BMP
} ESnapshotFormat;
+ enum ESnapshotMode
+ {
+ SNAPSHOT_SHARE,
+ SNAPSHOT_SAVE,
+ SNAPSHOT_MAIN
+ };
+
LLFloaterSnapshot(const LLSD& key);
virtual ~LLFloaterSnapshot();
@@ -56,6 +64,10 @@ public:
static void update();
+ void setAsProfilePic(const LLUUID& image_id);
+
+ bool updateButtons(ESnapshotMode mode);
+
static S32 getUIWinHeightLong() {return sUIWinHeightLong ;}
static S32 getUIWinHeightShort() {return sUIWinHeightShort ;}
static S32 getUIWinWidth() {return sUIWinWidth ;}
@@ -67,6 +79,8 @@ private:
static S32 sUIWinHeightLong ;
static S32 sUIWinHeightShort ;
static S32 sUIWinWidth ;
+
+ LLRect mRefreshBtnRect;
};
class LLSnapshotFloaterView : public LLFloaterView
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 7c42a581ff..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());
@@ -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*)
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 8ab050beaa..84ea353dab 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -315,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 f61c86db14..1b6ef0e97a 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -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);
@@ -428,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));
@@ -824,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
@@ -874,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/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index 67c0b530eb..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();
@@ -458,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);
@@ -657,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());
}
}
@@ -691,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();
}
}
}
@@ -1171,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
}
@@ -1194,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);
}
@@ -1220,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 23062bafec..a87f7288fa 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.
@@ -186,7 +187,7 @@ LLFolderView::LLFolderView(const Params& p)
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),
@@ -275,11 +276,6 @@ LLFolderView::~LLFolderView( void )
mRenamer = NULL;
mStatusTextBox = NULL;
- if( gEditMenuHandler == this )
- {
- gEditMenuHandler = NULL;
- }
-
mAutoOpenItems.removeAllNodes();
gIdleCallbacks.deleteFunction(idle, this);
@@ -417,11 +413,6 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen
S32 total_width = LEFT_PAD;
S32 running_height = mDebugFilters ? llceil(LLFontGL::getFontMonospace()->getLineHeight()) : 0;
S32 target_height = running_height;
- if(!mHasVisibleChildren)// is there any filtered items ?
- {
- //Nope. We need to display status textbox, let's reserve some place for it
- target_height += mStatusTextBox->getTextPixelHeight();
- }
S32 parent_item_height = getRect().getHeight();
for (folders_t::iterator iter = mFolders.begin();
@@ -481,6 +472,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 );
@@ -848,22 +846,22 @@ void LLFolderView::clearSelection()
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())
@@ -941,14 +939,16 @@ void LLFolderView::draw()
}
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 );
}
else
{
- mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage());
+ 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);
@@ -977,7 +977,6 @@ void LLFolderView::finishRenamingItem( void )
if( mRenameItem )
{
setSelectionFromRoot( mRenameItem, TRUE );
- mRenameItem = NULL;
}
// List is re-sorted alphabeticly, so scroll to make sure the selected item is visible.
@@ -1419,8 +1418,8 @@ 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));
+ mRenamer->setTopLostCallback(boost::bind(&LLFolderView::onRenamerLost, this, _1));
+ mRenamer->setFocusLostCallback(boost::bind(&LLFolderView::onRenamerLost, this, _1));
gViewerWindow->addPopup(mRenamer);
}
}
@@ -1745,6 +1744,8 @@ BOOL LLFolderView::handleMouseDown( S32 x, S32 y, MASK mask )
mParentPanel->setFocus(TRUE);
+ LLEditMenuHandler::gEditMenuHandler = this;
+
return LLView::handleMouseDown( x, y, mask );
}
@@ -1829,7 +1830,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();
@@ -2069,8 +2072,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;
@@ -2099,8 +2101,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);
@@ -2388,9 +2389,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 38255b3cea..0dfdbd364b 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -93,8 +93,9 @@ 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;
};
LLFolderView(const Params&);
virtual ~LLFolderView( void );
@@ -163,7 +164,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();
@@ -229,6 +230,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();
@@ -278,7 +280,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 );
diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h
index 12e100caf4..a2ef8c1d12 100644
--- a/indra/newview/llfoldervieweventlistener.h
+++ b/indra/newview/llfoldervieweventlistener.h
@@ -88,7 +88,7 @@ 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;
// 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 d3e3d2b57b..54e9bd5383 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()
@@ -255,11 +256,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)
@@ -367,6 +387,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;
@@ -417,11 +443,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;
}
@@ -804,32 +827,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(
@@ -837,22 +867,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;
@@ -871,152 +895,169 @@ 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))
+
+ //--------------------------------------------------------------------------------//
+ // 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())
- {
- // 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;
- }
- 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;
+ const LLViewerInventoryItem *item = getInventoryItem();
+ if (item && item->getIsLinkType()) 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);
+ }
- if (mStringMatchOffset != std::string::npos)
+ //--------------------------------------------------------------------------------//
+ // 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 );
+ }
+
+ //--------------------------------------------------------------------------------//
+ // 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 );
}
}
}
@@ -1027,20 +1068,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 )
@@ -1298,7 +1340,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
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 655ad89e99..57c722afa4 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -231,7 +231,7 @@ public:
virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items){ return FALSE; }
// 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();
diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index 18f81fe506..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"
@@ -110,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();
@@ -322,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());
@@ -407,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 1cda52c1d7..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)
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 0ba7bdf613..0996d09e25 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,7 +135,7 @@ 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;
@@ -152,7 +151,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 +247,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 +256,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 +298,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 +337,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 +385,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 +430,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 +438,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 +451,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 +461,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 +503,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 +516,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 +538,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 +555,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 +648,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 +682,7 @@ BOOL LLGestureManager::triggerGesture(KEY key, MASK mask)
}
-S32 LLGestureManager::getPlayingCount() const
+S32 LLGestureMgr::getPlayingCount() const
{
return mPlaying.size();
}
@@ -697,7 +696,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 +739,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 +756,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 +775,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 +886,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 +973,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 +986,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 +1030,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 +1091,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 +1136,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 +1150,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 +1168,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 +1182,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 +1213,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 +1222,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..d83d895dd0
--- /dev/null
+++ b/indra/newview/llgiveinventory.cpp
@@ -0,0 +1,541 @@
+/**
+ * @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
+void LLGiveInventory::doGiveInventoryItem(const LLUUID& to_agent,
+ const LLInventoryItem* item,
+ const LLUUID& im_session_id/* = LLUUID::null*/)
+
+{
+ llinfos << "LLGiveInventory::giveInventory()" << llendl;
+ if (!isInventoryGiveAcceptable(item))
+ {
+ return;
+ }
+ 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 payload;
+ payload["agent_id"] = to_agent;
+ payload["item_id"] = item->getUUID();
+ LLNotificationsUtil::add("CannotCopyWarning", LLSD(), payload,
+ &LLGiveInventory::handleCopyProtectedItem);
+ }
+}
+
+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.
+ if (im_session_id.notNull())
+ {
+ LLSD args;
+ 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))
+ {
+ LLSD args;
+ 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);
+ LLInventoryItem* item = NULL;
+ switch(option)
+ {
+ case 0: // "Yes"
+ item = gInventory.getItem(notification["payload"]["item_id"].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(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 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..e589a0cc69
--- /dev/null
+++ b/indra/newview/llgiveinventory.h
@@ -0,0 +1,99 @@
+/**
+ * @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 void 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);
+
+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);
+
+ // give inventory item functionality
+ static bool handleCopyProtectedItem(const LLSD& notification, const LLSD& response);
+ 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 8569e208eb..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)
{
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 8a056f836f..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");
@@ -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 real_group_selected && 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 0e9da25c58..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();
@@ -75,11 +62,6 @@ public:
void toggleIcons();
bool getIconsVisible() const { return mShowIcons; }
- // *WORKAROUND: two methods to overload appropriate Params due to localization issue:
- // no_groups_msg & no_filtered_groups_msg attributes are not defined as translatable in VLT. See EXT-5931
- void setNoGroupsMsg(const std::string& msg) { mNoGroupsMsg = msg; }
- void setNoFilteredGroupsMsg(const std::string& msg) { mNoFilteredGroupsMsg = msg; }
-
private:
void setDirty(bool val = true) { mDirty = val; }
void refresh();
@@ -94,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 aeac3841f9..996553ccf7 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -54,6 +54,7 @@
#include "llgroupactions.h"
#include "llnotificationsutil.h"
#include "lluictrlfactory.h"
+#include "lltrans.h"
#include <boost/regex.hpp>
#if LL_MSVC
@@ -159,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())
@@ -183,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());
@@ -199,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())
{
@@ -1062,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;
@@ -1717,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;
@@ -1727,7 +1746,7 @@ 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);
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index 2c86de8b97..82df631b8c 100644
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -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:
@@ -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);
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 325c9c260c..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
{
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 77eaebb0bc..3aa9d75bc0 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,12 +53,12 @@
#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"
@@ -128,6 +129,11 @@ void LLIMFloater::onFocusReceived()
LLIMModel::getInstance()->setActiveSessionID(mSessionID);
LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true);
+
+ if (getVisible())
+ {
+ LLIMModel::instance().sendNoUnreadMessages(mSessionID);
+ }
}
// virtual
@@ -365,6 +371,8 @@ void LLIMFloater::onSlide()
//static
LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
{
+ closeHiddenIMToasts();
+
if (!gIMMgr->hasSession(session_id)) return NULL;
if(!isChatMultiTab())
@@ -454,7 +462,7 @@ void LLIMFloater::getAllowedRect(LLRect& rect)
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"))));
@@ -473,7 +481,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,8 +501,8 @@ void LLIMFloater::setVisible(BOOL visible)
{
//only if floater was construced and initialized from xml
updateMessages();
- //prevent steal focus when IM opened in multitab mode
- if (!isChatMultiTab())
+ //prevent stealing focus when opening a background IM tab (EXT-5387, checking focus for EXT-6781)
+ if (!isChatMultiTab() || hasFocus())
{
mInputEditor->setFocus(TRUE);
}
@@ -609,7 +617,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())
{
@@ -642,6 +659,24 @@ void LLIMFloater::updateMessages()
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
@@ -651,6 +686,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++;
+ }
+ }
}
}
}
@@ -877,7 +925,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);
}
@@ -910,7 +958,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)
{
@@ -947,7 +995,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)
@@ -1038,6 +1086,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.
@@ -1086,3 +1169,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..fef178e3a2 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,10 @@ private:
// Remove the "User is typing..." indicator.
void removeTypingIndicator(const LLIMInfo* im_info = NULL);
+ static void closeHiddenIMToasts();
+
+ static void confirmLeaveCallCallback(const LLSD& notification, const LLSD& response);
+
LLPanelChatControlPanel* mControlPanel;
LLUUID mSessionID;
S32 mLastMessageIndex;
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 2dfc57532a..039df69454 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"
@@ -162,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),
@@ -256,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;
@@ -276,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()->addMessage(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()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, you_joined_call);
default:
break;
}
@@ -292,11 +294,10 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
switch(new_state)
{
case LLVoiceChannel::STATE_CALL_STARTED :
- message = you + " " + started_call;
- LLIMModel::getInstance()->addMessage(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;
+ message = LLTrans::getString("answered_call");
LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
default:
break;
@@ -311,8 +312,7 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
switch(new_state)
{
case LLVoiceChannel::STATE_CONNECTED :
- message = you + " " + joined_call;
- LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, you_joined_call);
default:
break;
}
@@ -322,8 +322,7 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
switch(new_state)
{
case LLVoiceChannel::STATE_CALL_STARTED :
- message = you + " " + started_call;
- LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, you_started_call);
break;
default:
break;
@@ -343,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:
@@ -444,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;
@@ -461,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);
@@ -592,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())
{
@@ -617,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);
}
@@ -629,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;
@@ -640,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++)
{
@@ -649,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;
@@ -660,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);
@@ -738,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);
}
@@ -898,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)
@@ -997,7 +1022,7 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
}
else
{
- for(std::vector<LLUUID>::iterator it = session->mInitialTargetIDs.begin();
+ for(uuid_vec_t::iterator it = session->mInitialTargetIDs.begin();
it!=session->mInitialTargetIDs.end();++it)
{
const LLUUID id = *it;
@@ -1129,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 )
@@ -1432,7 +1457,13 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)
}
sSession = session;
- sSession->mVoiceChannel->setStateChangedCallback(boost::bind(LLCallDialogManager::onVoiceChannelStateChanged, _1, _2, _3, _4));
+
+ 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;
@@ -1533,6 +1564,11 @@ LLCallDialog::LLCallDialog(const LLSD& payload)
setDocked(true);
}
+LLCallDialog::~LLCallDialog()
+{
+ LLUI::removePopup(this);
+}
+
void LLCallDialog::getAllowedRect(LLRect& rect)
{
rect = gViewerWindow->getWorldViewRectScaled();
@@ -1586,7 +1622,7 @@ void LLCallDialog::onOpen(const LLSD& key)
LLDockableFloater::onOpen(key);
// it should be over the all floaters. EXT-5116
- gFloaterView->bringToFront(this, FALSE);
+ LLUI::addPopup(this);
}
void LLCallDialog::setIcon(const LLSD& session_id, const LLSD& participant_id)
@@ -1681,11 +1717,10 @@ void LLOutgoingCallDialog::show(const LLSD& key)
channel_name = LLTextUtil::formatPhoneNumber(channel_name);
}
childSetTextArg("nearby", "[VOICE_CHANNEL_NAME]", channel_name);
- childSetTextArg("nearby_P2P_by_other", "[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::voiceEnabled() && gVoiceClient->voiceWorking();
+ 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);
@@ -1730,6 +1765,8 @@ void LLOutgoingCallDialog::show(const LLSD& key)
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)
{
@@ -1810,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();
@@ -2030,8 +2067,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);
}
}
@@ -2045,10 +2083,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
@@ -2136,11 +2174,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
{
@@ -2707,6 +2742,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;
}
@@ -3046,7 +3087,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 c4a8dd076e..ffa8a16797 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -79,7 +79,7 @@ public:
} SType;
LLIMSession(const LLUUID& session_id, const std::string& name,
- const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, 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);
@@ -111,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
@@ -170,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.
@@ -185,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);
@@ -196,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);
@@ -262,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);
@@ -484,7 +495,7 @@ class LLCallDialog : public LLDockableFloater
{
public:
LLCallDialog(const LLSD& payload);
- ~LLCallDialog() {}
+ ~LLCallDialog();
virtual BOOL postBuild();
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index 14bc4376fe..d9fdc876db 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -58,6 +58,7 @@
#include "llfloaterreg.h"
#include "llmenubutton.h"
#include "lltooltip.h" // positionViewNearMouse()
+#include "lltrans.h"
#include "lluictrl.h"
#include "llavatariconctrl.h"
@@ -137,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();
@@ -235,6 +237,7 @@ 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));
@@ -378,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;
@@ -534,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
@@ -564,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
@@ -574,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 );
}
@@ -610,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(
@@ -772,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 27a40c6ba0..577652fc79 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -31,26 +31,29 @@
*/
#include "llviewerprecompiledheaders.h"
+#include "llinventorybridge.h"
+
// external projects
#include "lltransfersourceasset.h"
-#include "llinventorybridge.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"
@@ -58,9 +61,11 @@
#include "llpreviewgesture.h"
#include "llpreviewtexture.h"
#include "llselectmgr.h"
+#include "llsidepanelappearance.h"
#include "llsidetray.h"
#include "lltrans.h"
#include "llviewerassettype.h"
+#include "llviewermenu.h"
#include "llviewermessage.h"
#include "llviewerobjectlist.h"
#include "llviewerwindow.h"
@@ -68,6 +73,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
@@ -91,59 +108,28 @@ 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();
@@ -159,7 +145,6 @@ const std::string& LLInvFVBridge::getDisplayName() const
// Folders have full perms
PermissionMask LLInvFVBridge::getPermissionMask() const
{
-
return PERM_ALL;
}
@@ -191,10 +176,14 @@ BOOL LLInvFVBridge::isItemRemovable() const
return FALSE;
}
- // Disable delete from COF folder; have users explicitly choose "detach/take off".
- if (LLAppearanceManager::instance().getIsProtectedCOFItem(mUUID))
+ // 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(mUUID))
{
- return FALSE;
+ if (get_is_item_worn(mUUID))
+ {
+ return FALSE;
+ }
}
const LLInventoryObject *obj = model->getItem(mUUID);
@@ -215,6 +204,11 @@ BOOL LLInvFVBridge::isItemMovable() const
return TRUE;
}
+BOOL LLInvFVBridge::isLink() const
+{
+ return mIsLink;
+}
+
/*virtual*/
/**
* @brief Adds this item into clipboard storage
@@ -229,13 +223,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);
*/
}
@@ -259,7 +251,7 @@ void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batc
{
if(LLAssetType::AT_GESTURE == item->getType())
{
- LLGestureManager::instance().deactivateGesture(item->getUUID());
+ LLGestureMgr::instance().deactivateGesture(item->getUUID());
}
}
}
@@ -275,7 +267,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());
}
}
}
@@ -296,7 +288,7 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*
LLMessageSystem* msg = gMessageSystem;
const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
LLViewerInventoryItem* item = 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();
@@ -397,8 +389,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);
@@ -474,7 +466,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;
}
@@ -483,8 +475,8 @@ 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();
@@ -592,7 +584,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
LLViewerInventoryItem* inv_item = gInventory.getItem(mUUID);
if (inv_item)
{
- is_asset_knowable = is_asset_id_knowable(inv_item->getType());
+ 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() ) )
@@ -621,7 +613,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
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)
@@ -652,7 +644,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);
@@ -683,14 +681,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))
{
@@ -707,6 +706,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
{
@@ -727,7 +737,7 @@ BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
if (*type == DAD_CATEGORY)
{
- gInventory.startBackgroundFetch(obj->getUUID());
+ LLInventoryModelBackgroundFetch::instance().start(obj->getUUID());
}
rv = TRUE;
@@ -800,7 +810,7 @@ BOOL LLInvFVBridge::isAgentInventory() const
BOOL LLInvFVBridge::isCOFFolder() const
{
- return LLAppearanceManager::instance().getIsInCOF(mUUID);
+ return LLAppearanceMgr::instance().getIsInCOF(mUUID);
}
BOOL LLInvFVBridge::isItemPermissive() const
@@ -814,21 +824,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
@@ -857,21 +853,11 @@ void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model,
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;
-}
-
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)
{
@@ -881,104 +867,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): "
@@ -1010,16 +996,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 |
// +=================================================+
@@ -1027,29 +1031,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;
@@ -1097,7 +1103,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();
@@ -1109,7 +1115,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();
@@ -1120,7 +1126,7 @@ void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model,
void LLItemBridge::selectItem()
{
LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem());
- if(item && !item->isComplete())
+ if(item && !item->isFinished())
{
item->fetchFromServer();
}
@@ -1178,7 +1184,7 @@ void LLItemBridge::restoreToWorld()
}
}
-void LLItemBridge::gotoItem(LLFolderView *folder)
+void LLItemBridge::gotoItem()
{
LLInventoryObject *obj = getInventoryObject();
if (obj && obj->getIsLinkType())
@@ -1193,25 +1199,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;
}
@@ -1356,13 +1359,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))
{
@@ -1371,11 +1426,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
@@ -1395,17 +1446,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;
}
@@ -1504,14 +1549,10 @@ BOOL LLFolderBridge::isItemRemovable() const
return FALSE;
}
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if( !avatar )
- {
- return FALSE;
- }
+ if (!isAgentAvatarValid()) return FALSE;
LLInventoryCategory* category = model->getCategory(mUUID);
- if( !category )
+ if(!category)
{
return FALSE;
}
@@ -1550,6 +1591,11 @@ BOOL LLFolderBridge::isUpToDate() const
BOOL LLFolderBridge::isItemCopyable() const
{
+ if (gSavedSettings.getBOOL("InventoryLinking"))
+ {
+ // Can copy folders to paste-as-link, but not for straight paste.
+ return TRUE;
+ }
return FALSE;
}
@@ -1659,8 +1705,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())
@@ -1684,7 +1729,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);
@@ -1732,12 +1777,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)
@@ -1746,9 +1790,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());
}
}
}
@@ -1761,7 +1805,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
{
@@ -1769,28 +1813,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
}
}
@@ -1807,7 +1853,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();
@@ -1852,7 +1898,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())
@@ -1866,8 +1912,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
@@ -1897,7 +1943,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;
@@ -1925,61 +1971,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();
- 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;
-}
-
-
-
//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
@@ -2000,7 +2006,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:
@@ -2011,7 +2021,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();
@@ -2025,7 +2035,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);
@@ -2043,14 +2053,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.
@@ -2063,19 +2073,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);
}*/
}
@@ -2089,7 +2099,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);
@@ -2128,7 +2139,7 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask)
if (NULL == category)
{
llwarns << "gInventory.getCategory(" << mCatID
- << ") was NULL" << llendl;
+ << ") was NULL" << llendl;
}
else
{
@@ -2136,7 +2147,7 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask)
mContentsCount)
{
gInventory.removeObserver(this);
- LLAppearanceManager::instance().wearInventoryCategory(category, FALSE, TRUE);
+ LLAppearanceMgr::instance().wearInventoryCategory(category, FALSE, TRUE);
delete this;
}
}
@@ -2147,11 +2158,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);
@@ -2186,7 +2197,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
@@ -2310,23 +2321,39 @@ LLUIImagePtr LLFolderBridge::getIcon() const
return getIcon(preferred_type);
}
-LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type)
+// static
+LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type, BOOL is_link)
{
- // we only have one folder image now
- if (preferred_type == LLFolderType::FT_OUTFIT)
+ // Bypassing LLViewerFolderType::lookup() since
+ // we aren't using different system folder icons
+ if (is_link)
{
- return LLUI::getUIImage("Inv_LookFolderClosed");
+ if (preferred_type == LLFolderType::FT_OUTFIT)
+ return LLUI::getUIImage("Inv_LookFolderClosed_Link");
+ else
+ return LLUI::getUIImage("Inv_FolderClosed_Link");
}
- return LLUI::getUIImage("Inv_FolderClosed");
+ if (preferred_type == LLFolderType::FT_OUTFIT)
+ return LLUI::getUIImage("Inv_LookFolderClosed");
+ else
+ return LLUI::getUIImage("Inv_FolderClosed");
}
LLUIImagePtr LLFolderBridge::getOpenIcon() const
{
- if (getPreferredType() == LLFolderType::FT_OUTFIT)
+ // Bypassing LLViewerFolderType::lookup() since
+ // we aren't using different system folder icons
+ if (isLink())
{
- return LLUI::getUIImage("Inv_LookFolderOpen");
+ if (getPreferredType() == LLFolderType::FT_OUTFIT)
+ return LLUI::getUIImage("Inv_LookFolderOpen_Link");
+ else
+ return LLUI::getUIImage("Inv_FolderOpen_Link");
}
- return LLUI::getUIImage("Inv_FolderOpen");
+ if (getPreferredType() == LLFolderType::FT_OUTFIT)
+ return LLUI::getUIImage("Inv_LookFolderOpen");
+ else
+ return LLUI::getUIImage("Inv_FolderOpen");
}
BOOL LLFolderBridge::renameItem(const std::string& new_name)
@@ -2416,9 +2443,9 @@ bool LLFolderBridge::removeItemResponse(const LLSD& notification, const LLSD& re
const LLViewerInventoryItem* item = (*iter);
const LLUUID& item_id = item->getUUID();
if (item->getType() == LLAssetType::AT_GESTURE
- && LLGestureManager::instance().isGestureActive(item_id))
+ && LLGestureMgr::instance().isGestureActive(item_id))
{
- LLGestureManager::instance().deactivateGesture(item_id);
+ LLGestureMgr::instance().deactivateGesture(item_id);
}
}
@@ -2491,26 +2518,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));
}
@@ -2538,7 +2565,7 @@ void LLFolderBridge::folderOptionsMenu()
const bool is_system_folder = LLFolderType::lookupIsProtectedType(type);
// BAP change once we're no longer treating regular categories as ensembles.
const bool is_ensemble = (type == LLFolderType::FT_NONE ||
- LLFolderType::lookupIsEnsembleType(type));
+ LLFolderType::lookupIsEnsembleType(type));
// calling card related functionality for folders.
@@ -2668,10 +2695,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)
{
@@ -2689,8 +2723,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))
@@ -2722,7 +2755,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"));
@@ -2752,17 +2785,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();
@@ -2785,7 +2819,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);
}
@@ -2877,71 +2917,71 @@ 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();
@@ -2951,16 +2991,16 @@ void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType 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)
+void LLFolderBridge::createWearable(const LLUUID &parent_id, LLWearableType::EType 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));
+ parent_id, wearable->getTransactionID(), wearable->getName(),
+ wearable->getDescription(), asset_type, inv_type, wearable->getType(),
+ wearable->getPermissions().getMaskNextOwner(),
+ LLPointer<LLInventoryCallback>(NULL));
}
void LLFolderBridge::modifyOutfit(BOOL append)
@@ -2970,7 +3010,7 @@ void LLFolderBridge::modifyOutfit(BOOL append)
LLViewerInventoryCategory* cat = getCategory();
if(!cat) return;
- LLAppearanceManager::instance().wearInventoryCategory( cat, FALSE, append );
+ LLAppearanceMgr::instance().wearInventoryCategory( cat, FALSE, append );
}
// helper stuff
@@ -2984,7 +3024,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
@@ -2994,8 +3034,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);
}
@@ -3025,8 +3065,7 @@ 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;
@@ -3036,11 +3075,11 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
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);
@@ -3048,7 +3087,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_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 = LLAppearanceManager::instance().getIsInCOF(inv_item->getUUID());
+ 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)
@@ -3080,9 +3119,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
@@ -3135,7 +3174,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
{
@@ -3145,6 +3184,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
inv_item->getLinkedUUID(),
mUUID,
inv_item->getName(),
+ inv_item->getDescription(),
LLAssetType::AT_LINK,
cb);
}
@@ -3205,6 +3245,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);
@@ -3218,13 +3261,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)
@@ -3247,21 +3290,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, mIsLink);
}
void LLTextureBridge::openItem()
@@ -3301,7 +3335,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);
@@ -3317,7 +3357,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)
{
@@ -3328,38 +3368,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()
@@ -3389,6 +3411,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"));
@@ -3405,11 +3432,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;
}
@@ -3417,7 +3447,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, mIsLink, mVisited, FALSE);
}
void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
@@ -3432,6 +3462,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"));
@@ -3467,7 +3502,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)
{
@@ -3491,7 +3526,7 @@ void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* mod
}
else
{
- LLItemBridge::performAction(folder, model, action);
+ LLItemBridge::performAction(model, action);
}
}
@@ -3518,35 +3553,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);
@@ -3569,7 +3602,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)
{
@@ -3595,7 +3628,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
@@ -3606,7 +3639,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, mIsLink, online, FALSE);
}
std::string LLCallingCardBridge::getLabelSuffix() const
@@ -3631,11 +3664,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());
+ }
*/
}
@@ -3651,15 +3684,20 @@ 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);
LLInventoryItem* item = getItem();
BOOL good_card = (item
- && (LLUUID::null != item->getCreatorUUID())
- && (item->getCreatorUUID() != gAgent.getID()));
+ && (LLUUID::null != item->getCreatorUUID())
+ && (item->getCreatorUUID() != gAgent.getID()));
BOOL user_online = FALSE;
if (item)
{
@@ -3694,16 +3732,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();
@@ -3713,7 +3751,7 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
rv = TRUE;
if(drop)
{
- LLToolDragAndDrop::giveInventory(item->getCreatorUUID(),
+ LLGiveInventory::doGiveInventoryItem(item->getCreatorUUID(),
(LLInventoryItem*)cargo_data);
}
}
@@ -3726,7 +3764,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() ) )
@@ -3734,7 +3772,7 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
rv = TRUE;
if(drop)
{
- LLToolDragAndDrop::giveInventoryCategory(
+ LLGiveInventory::doGiveInventoryCategory(
item->getCreatorUUID(),
inv_cat);
}
@@ -3748,8 +3786,8 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
}
break;
}
- default:
- break;
+ default:
+ break;
}
}
return rv;
@@ -3759,42 +3797,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;
}
@@ -3806,9 +3824,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
{
@@ -3817,11 +3837,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;
@@ -3833,7 +3853,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;
@@ -3845,17 +3865,17 @@ 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));
+ LLGestureMgr::instance().setGestureLoadedCallback(mUUID, boost::bind(&LLGestureBridge::playGesture, mUUID));
LLViewerInventoryItem* item = gInventory.getItem(mUUID);
llassert(item);
if (item)
{
- LLGestureManager::instance().activateGestureWithAsset(mUUID, item->getAssetUUID(), inform_server, deactivate_similar);
+ LLGestureMgr::instance().activateGestureWithAsset(mUUID, item->getAssetUUID(), inform_server, deactivate_similar);
}
}
else
@@ -3863,7 +3883,7 @@ void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* mode
playGesture(mUUID);
}
}
- else LLItemBridge::performAction(folder, model, action);
+ else LLItemBridge::performAction(model, action);
}
void LLGestureBridge::openItem()
@@ -3875,12 +3895,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);
+ }
*/
}
@@ -3897,7 +3917,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))
@@ -3919,18 +3939,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"));
}
@@ -3945,13 +3970,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);
}
}
@@ -3960,11 +3985,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;
@@ -3977,6 +3997,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"));
@@ -3992,7 +4017,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"))
{
@@ -4011,7 +4036,7 @@ void LLAnimationBridge::performAction(LLFolderView* folder, LLInventoryModel* mo
}
else
{
- LLItemBridge::performAction(folder, model, action);
+ LLItemBridge::performAction(model, action);
}
}
@@ -4024,11 +4049,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);
+ }
*/
}
@@ -4039,17 +4064,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, mIsLink, mAttachPt, mIsMultiObject);
}
LLInventoryObject* LLObjectBridge::getObject() const
@@ -4064,7 +4093,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))
{
@@ -4075,7 +4104,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);
@@ -4108,26 +4137,14 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model
}
}
}
- 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);
- */
+ // object double-click action is to wear/unwear object
+ performAction(getInventoryModel(),
+ get_is_item_worn(mUUID) ? "detach" : "attach");
}
LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const
@@ -4152,12 +4169,11 @@ 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
@@ -4172,10 +4188,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)
{
@@ -4201,9 +4217,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);
@@ -4251,6 +4265,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)
@@ -4265,18 +4284,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"));
@@ -4285,7 +4300,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"));
@@ -4293,15 +4308,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;
@@ -4351,11 +4365,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 );
@@ -4373,11 +4386,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();
@@ -4386,19 +4394,25 @@ void LLLSLTextBridge::openItem()
{
LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
}
- /*
- LLViewerInventoryItem* item = getItem();
- if (item)
- {
- LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES);
- }
- */
}
// +=================================================+
// | LLWearableBridge |
// +=================================================+
+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)
+{
+ mInvType = inv_type;
+}
+
// *NOTE: hack to get from avatar inventory to avatar
void wear_inventory_item_on_avatar( LLInventoryItem* item )
{
@@ -4407,7 +4421,7 @@ void wear_inventory_item_on_avatar( LLInventoryItem* item )
lldebugs << "wear_inventory_item_on_avatar( " << item->getName()
<< " )" << llendl;
- LLAppearanceManager::instance().addCOFItemLink(item);
+ LLAppearanceMgr::getInstance()->wearItemOnAvatar(item->getUUID(), true, false);
}
}
@@ -4419,10 +4433,10 @@ void wear_add_inventory_item_on_avatar( LLInventoryItem* item )
<< " )" << llendl;
LLWearableList::instance().getAsset(item->getAssetUUID(),
- item->getName(),
- item->getType(),
- LLWearableBridge::onWearAddOnAvatarArrived,
- new LLUUID(item->getUUID()));
+ item->getName(),
+ item->getType(),
+ LLWearableBridge::onWearAddOnAvatarArrived,
+ new LLUUID(item->getUUID()));
}
}
@@ -4433,15 +4447,13 @@ void remove_inventory_category_from_avatar( LLInventoryCategory* category )
<< " )" << llendl;
- if( gFloaterCustomize )
+ if (gAgentCamera.cameraCustomizeAvatar())
{
- gFloaterCustomize->askToSaveIfDirty(
- boost::bind(remove_inventory_category_from_avatar_step2, _1, category->getUUID()));
- }
- else
- {
- 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
@@ -4500,7 +4512,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()))
{
@@ -4544,7 +4556,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();
}
@@ -4578,11 +4590,11 @@ std::string LLWearableBridge::getLabelSuffix() const
LLUIImagePtr LLWearableBridge::getIcon() const
{
- return get_item_icon(mAssetType, mInvType, mWearableType, FALSE);
+ return LLInventoryIcon::getIcon(mAssetType, mInvType, mIsLink, mWearableType, FALSE);
}
// virtual
-void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+void LLWearableBridge::performAction(LLInventoryModel* model, std::string action)
{
if (isAddAction(action))
{
@@ -4602,7 +4614,7 @@ void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* mod
removeFromAvatar();
return;
}
- else LLItemBridge::performAction(folder, model, action);
+ else LLItemBridge::performAction(model, action);
}
void LLWearableBridge::openItem()
@@ -4613,42 +4625,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)
@@ -4676,11 +4652,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)
@@ -4702,7 +4683,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"));
@@ -4747,7 +4728,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));
}
@@ -4896,19 +4877,12 @@ void LLWearableBridge::onEditOnAvatar(void* user_data)
void LLWearableBridge::editOnAvatar()
{
- LLUUID linked_id = gInventory.getLinkedItemID(mUUID);
- const LLWearable* wearable = gAgentWearables.getWearableFromItemID(linked_id);
+ LLWearable* wearable = gAgentWearables.getWearableFromItemID(mUUID);
if( wearable )
{
- // Set the tab to the right wearable.
- if (gFloaterCustomize)
- gFloaterCustomize->setCurrentWearableType( wearable->getType() );
+ LLPanel * panel = LLSideTray::getInstance()->getPanel("sidepanel_appearance");
- if( CAMERA_MODE_CUSTOMIZE_AVATAR != gAgent.getCameraMode() )
- {
- // Start Avatar Customization
- gAgent.changeCameraToCustomizeAvatar();
- }
+ LLSidepanelAppearance::editWearable(wearable, panel);
}
}
@@ -4953,71 +4927,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)
+ for (S32 index = gAgentWearables.getWearableCount(itype)-1; index >= 0 ; --index)
{
- 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);
+ 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();
@@ -5026,7 +4976,7 @@ void LLWearableBridge::removeAllClothesFromAvatar()
LLAgentWearables::userRemoveAllClothes();
}
-/* static */
+// static
void LLWearableBridge::removeItemFromAvatar(LLViewerInventoryItem *item)
{
if (item)
@@ -5048,65 +4998,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, TRUE);
+}
- 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();
@@ -5114,7 +5130,7 @@ void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type,
}
}
-//static
+// static
void LLInvFVBridgeAction::doAction(const LLUUID& uuid, LLInventoryModel* model)
{
llassert(model);
@@ -5134,129 +5150,232 @@ void LLInvFVBridgeAction::doAction(const LLUUID& uuid, LLInventoryModel* model)
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()
+ {
+ 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->isFinished())
+ {
+ 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");
+ }
+ }
+ LLInvFVBridgeAction::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();
+};
BOOL LLWearableBridgeAction::isItemInTrash() const
{
@@ -5303,164 +5422,114 @@ void LLWearableBridgeAction::wearOnAvatar()
}
}
-//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
+/** Bridge Actions
+ **
+ ********************************************************************************/
-std::string LLLinkItemBridge::sPrefix("Link: ");
-
-
-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::find(items.begin(), items.end(), std::string("New Folder")));
+ items.erase(std::find(items.begin(), items.end(), std::string("New Script")));
+ items.erase(std::find(items.begin(), items.end(), std::string("New Note")));
+ items.erase(std::find(items.begin(), items.end(), std::string("New Gesture")));
+ items.erase(std::find(items.begin(), items.end(), std::string("New Clothes")));
+ items.erase(std::find(items.begin(), items.end(), std::string("New Body Parts")));
- 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..c5efefac7e 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,7 +116,7 @@ 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,
@@ -183,12 +124,6 @@ public:
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;
-
//--------------------------------------------------------------------
// Convenience functions for adding various common menu options.
//--------------------------------------------------------------------
@@ -197,9 +132,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 +143,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 +156,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 +209,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;
@@ -302,7 +245,7 @@ public:
virtual LLFolderType::EType getPreferredType() const;
virtual LLUIImagePtr getIcon() const;
virtual LLUIImagePtr getOpenIcon() const;
- static LLUIImagePtr getIcon(LLFolderType::EType preferred_type);
+ static LLUIImagePtr getIcon(LLFolderType::EType preferred_type, BOOL is_link = FALSE);
virtual BOOL renameItem(const std::string& new_name);
@@ -326,23 +269,17 @@ 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);
+ static void createWearable(const LLUUID &parent_folder_id, 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);
@@ -363,10 +300,17 @@ protected:
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,202 +319,156 @@ 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;
@@ -594,61 +492,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 +538,65 @@ 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){}
-
};
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Recent Inventory Panel related classes
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-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){}
-
-};
-
-
-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 +606,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..c90919e8fd 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"
@@ -53,7 +55,8 @@ LLInventoryFilter::FilterOps::FilterOps() :
mShowFolderState(SHOW_NON_EMPTY_FOLDERS),
mPermissions(PERM_NONE),
mFilterTypes(FILTERTYPE_OBJECT),
- mFilterUUID(LLUUID::null)
+ mFilterUUID(LLUUID::null),
+ mIncludeLinks(TRUE)
{
}
@@ -96,23 +99,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,7 +130,9 @@ 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))
{
@@ -202,6 +207,22 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item)
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
{
@@ -328,9 +349,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 +471,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 +747,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 +858,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..3ef51baefc 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -84,6 +84,7 @@ public:
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 +98,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;
// +-------------------------------------------------------------------+
@@ -171,6 +176,7 @@ private:
U32 mHoursAgo;
EFolderShow mShowFolderState;
PermissionMask mPermissions;
+ BOOL mIncludeLinks;
};
U32 mOrder;
@@ -181,6 +187,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 3553137f53..f67d91cfa5 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,6 @@
#include "llappearancemgr.h"
#include "llappviewer.h"
//#include "llfirstuse.h"
-#include "llfloatercustomize.h"
#include "llfocusmgr.h"
#include "llfolderview.h"
#include "llgesturemgr.h"
@@ -73,6 +73,7 @@
#include "llscrollbar.h"
#include "llscrollcontainer.h"
#include "llselectmgr.h"
+#include "llsidetray.h"
#include "lltabcontainer.h"
#include "lltooldraganddrop.h"
#include "lluictrlfactory.h"
@@ -86,6 +87,308 @@
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();
+ }
+}
+
+
+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;
+}
+
+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)
+{
+ LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if (!active_panel) return;
+ active_panel->setSelection(gInventory.getLinkedItemID(item_uuid), TAKE_FOCUS_NO);
+}
+
+///----------------------------------------------------------------------------
+/// 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;
+}
+
+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;
+}
+
+///----------------------------------------------------------------------------
+/// 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,180 +497,3 @@ void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder)
folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
}
}
-
-static void assign_clothing_bodypart_icon(EInventoryIcon &idx, U32 attachment_point)
-{
- const EWearableType wearable_type = EWearableType(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point);
- switch(wearable_type)
- {
- 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:
- break;
- }
-}
-
-
-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;
- assign_clothing_bodypart_icon(idx, attachment_point);
- break;
- case LLAssetType::AT_BODYPART:
- idx = BODYPART_ICON_NAME;
- assign_clothing_bodypart_icon(idx, attachment_point);
- 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..8b96ba29d9 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -38,15 +38,248 @@
#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);
+
+void show_item_profile(const LLUUID& item_uuid);
+
+void show_item_original(const LLUUID& item_uuid);
+
+void change_item_parent(LLInventoryModel* model,
+ LLViewerInventoryItem* item,
+ const LLUUID& new_parent_id,
+ BOOL restamp);
+
+// 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
//
-// 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.
+// 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);
+};
+
+//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);
+
+ const LLWearableType::EType mWearableType;
+};
+
+/** Inventory Collector Functions
+ ** **
+ *******************************************************************************/
+
class LLInventoryState
{
public:
@@ -64,7 +297,7 @@ public:
virtual void doItem(LLFolderViewItem* item);
BOOL wasItemSelected() { return mItemSelected; }
protected:
- BOOL mItemSelected;
+ BOOL mItemSelected;
};
class LLOpenFilteredFolders : public LLFolderViewFunctor
@@ -99,19 +332,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..2fb55f4c1f
--- /dev/null
+++ b/indra/newview/llinventoryicon.cpp
@@ -0,0 +1,187 @@
+/**
+ * @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,
+ const std::string &link_name)
+ :
+ LLDictionaryEntry(item_name),
+ mLinkName(link_name)
+ {}
+ const std::string mLinkName;
+};
+
+class LLIconDictionary : public LLSingleton<LLIconDictionary>,
+ public LLDictionary<LLInventoryIcon::EIconName, IconEntry>
+{
+public:
+ LLIconDictionary();
+};
+
+LLIconDictionary::LLIconDictionary()
+{
+ addEntry(LLInventoryIcon::ICONNAME_TEXTURE, new IconEntry("Inv_Texture", "Inv_Texture_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_SOUND, new IconEntry("Inv_Texture", "Inv_Texture_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_ONLINE, new IconEntry("Inv_CallingCard", "Inv_CallingCard_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_OFFLINE, new IconEntry("Inv_CallingCard", "Inv_CallingCard_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_LANDMARK, new IconEntry("Inv_Landmark", "Inv_Landmark_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_LANDMARK_VISITED, new IconEntry("Inv_Landmark", "Inv_Landmark_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_SCRIPT, new IconEntry("Inv_Script", "Inv_Script_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING, new IconEntry("Inv_Clothing", "Inv_Clothing_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_OBJECT, new IconEntry("Inv_Object", "Inv_Object_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_OBJECT_MULTI, new IconEntry("Inv_Object_Multi", "Inv_Object_Multi_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_NOTECARD, new IconEntry("Inv_Notecard", "Inv_Notecard_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_BODYPART, new IconEntry("Inv_Skin", "Inv_Skin_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_SNAPSHOT, new IconEntry("Inv_Snapshot", "Inv_Snapshot_Link"));
+
+ addEntry(LLInventoryIcon::ICONNAME_BODYPART_SHAPE, new IconEntry("Inv_BodyShape", "Inv_BodyShape_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_BODYPART_SKIN, new IconEntry("Inv_Skin", "Inv_Skin_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_BODYPART_HAIR, new IconEntry("Inv_Hair", "Inv_Hair_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_BODYPART_EYES, new IconEntry("Inv_Eye", "Inv_Eye_Link"));
+
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SHIRT, new IconEntry("Inv_Shirt", "Inv_Shirt_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_PANTS, new IconEntry("Inv_Pants", "Inv_Pants_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SHOES, new IconEntry("Inv_Shoe", "Inv_Shoe_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SOCKS, new IconEntry("Inv_Socks", "Inv_Socks_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_JACKET, new IconEntry("Inv_Jacket", "Inv_Jacket_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_GLOVES, new IconEntry("Inv_Gloves", "Inv_Gloves_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT, new IconEntry("Inv_Undershirt", "Inv_Undershirt_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS, new IconEntry("Inv_Underpants", "Inv_Underpants_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SKIRT, new IconEntry("Inv_Skirt", "Inv_Skirt_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_ALPHA, new IconEntry("Inv_Alpha", "Inv_Alpha_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_TATTOO, new IconEntry("Inv_Tattoo", "Inv_Tattoo_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_ANIMATION, new IconEntry("Inv_Animation", "Inv_Animation_Link"));
+ addEntry(LLInventoryIcon::ICONNAME_GESTURE, new IconEntry("Inv_Gesture", "Inv_Gesture_Link"));
+
+ addEntry(LLInventoryIcon::ICONNAME_LINKITEM, new IconEntry("Inv_LinkItem", "Inv_LinkItem"));
+ addEntry(LLInventoryIcon::ICONNAME_LINKFOLDER, new IconEntry("Inv_LinkItem", "Inv_LinkItem"));
+
+ addEntry(LLInventoryIcon::ICONNAME_NONE, new IconEntry("NONE", "NONE"));
+}
+
+LLUIImagePtr LLInventoryIcon::getIcon(LLAssetType::EType asset_type,
+ LLInventoryType::EType inventory_type,
+ BOOL item_is_link,
+ U32 misc_flag,
+ BOOL item_is_multi)
+{
+ const std::string& icon_name = getIconName(asset_type, inventory_type, item_is_link, 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,
+ BOOL item_is_link,
+ 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, item_is_link);
+}
+
+
+const std::string& LLInventoryIcon::getIconName(EIconName idx, BOOL item_is_link)
+{
+ const IconEntry *entry = LLIconDictionary::instance().lookup(idx);
+ if (item_is_link) return entry->mLinkName;
+ 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..4cb7a123c4
--- /dev/null
+++ b/indra/newview/llinventoryicon.h
@@ -0,0 +1,108 @@
+/**
+ * @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,
+ BOOL item_is_link = FALSE,
+ U32 misc_flag = 0, // different meanings depending on item type
+ BOOL item_is_multi = FALSE);
+ static const std::string& getIconName(EIconName idx,
+ BOOL item_is_link = FALSE);
+
+ static LLUIImagePtr getIcon(LLAssetType::EType asset_type,
+ LLInventoryType::EType inventory_type = LLInventoryType::IT_NONE,
+ BOOL item_is_link = FALSE,
+ 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..1c3eb547bb
--- /dev/null
+++ b/indra/newview/llinventoryitemslist.cpp
@@ -0,0 +1,458 @@
+/**
+ * @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())
+ {
+ updateItem();
+ setNeedsRefresh(false);
+ }
+ LLPanel::draw();
+}
+
+void LLPanelInventoryListItemBase::updateItem()
+{
+ setIconImage(mIconImage);
+ setTitle(mItem->getName(), mHighlightedText);
+}
+
+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"));
+
+ mIconImage = LLInventoryIcon::getIcon(mItem->getType(), mItem->getInventoryType(), mItem->getIsLinkType(), mItem->getFlags(), FALSE);
+
+ 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);
+}
+
+S32 LLPanelInventoryListItemBase::notify(const LLSD& info)
+{
+ S32 rv = 0;
+ if(info.has("match_filter"))
+ {
+ mHighlightedText = info["match_filter"].asString();
+
+ std::string test(mItem->getName());
+ 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)
+{
+ LLTextUtil::textboxSetHighlightedVal(
+ mTitleCtrl,
+ LLStyle::Params(),
+ title,
+ highlit_text);
+}
+
+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 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
+ 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..807952948b
--- /dev/null
+++ b/indra/newview/llinventoryitemslist.h
@@ -0,0 +1,282 @@
+/**
+ * @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 { return mItem->getName(); }
+
+ /** Get the asset type of a corresponding inventory item */
+ LLAssetType::EType getType() const { return mItem->getType(); }
+
+ /** Get the wearable type of a corresponding inventory item */
+ LLWearableType::EType getWearableType() const { return mItem->getWearableType(); }
+
+ /** Get the description of a corresponding inventory item */
+ const std::string& getDescription() const { return mItem->getDescription(); }
+
+ 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();
+
+ /** 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 */
+ void setTitle(const std::string& title, const std::string& highlit_text);
+
+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();
+
+ LLViewerInventoryItem* mItem;
+
+ 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 83a466a243..2e1c5238d3 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -57,32 +57,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 +319,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 +341,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 +566,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 +585,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;
@@ -1040,98 +1005,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 +1095,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 +1168,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 +1193,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(LLInventoryPanel::DEFAULT_SORT_ORDER) & 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,7 +1249,11 @@ void LLInventoryModel::addCategory(LLViewerInventoryCategory* category)
void LLInventoryModel::addItem(LLViewerInventoryItem* item)
{
- //llinfos << "LLInventoryModel::addItem()" << llendl;
+ /*
+ const LLViewerInventoryCategory* cat = gInventory.getCategory(item->getParentUUID()); // Seraph remove for 2.1
+ const std::string cat_name = cat ? cat->getName() : "CAT NOT FOUND"; // Seraph remove for 2.1
+ llinfos << "Added item [ name:" << item->getName() << " UUID:" << item->getUUID() << " type:" << item->getActualType() << " ] to folder [ name:" << cat_name << " uuid:" << item->getParentUUID() << " ]" << llendl; // Seraph remove for 2.1
+ */
llassert(item);
if(item)
@@ -2389,88 +1707,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.
@@ -2595,7 +1831,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;
@@ -2634,7 +1870,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)
{
@@ -2738,73 +1974,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,
@@ -3094,7 +2263,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)
{
@@ -3110,7 +2279,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);
}
@@ -3190,7 +2359,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)
@@ -3204,7 +2373,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);
}
@@ -3317,7 +2486,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)
@@ -3650,6 +2819,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);
@@ -3665,6 +2838,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;
@@ -3708,6 +2882,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;
@@ -3764,207 +2940,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..0ff6ab2644
--- /dev/null
+++ b/indra/newview/llinventorymodelbackgroundfetch.cpp
@@ -0,0 +1,627 @@
+/**
+ * @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"
+
+// Seraph clean this up
+#include "llagent.h"
+#include "llinventorypanel.h"
+#include "llviewercontrol.h"
+#include "llviewermessage.h"
+#include "llviewerwindow.h"
+#include "llappviewer.h"
+#include "llviewerregion.h"
+#include "llcallbacklist.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()
+{
+ return mFetchQueue.empty() && mBulkFetchCount<=0;
+}
+
+bool LLInventoryModelBackgroundFetch::libraryFetchStarted()
+{
+ return mRecursiveLibraryFetchStarted;
+}
+
+bool LLInventoryModelBackgroundFetch::libraryFetchCompleted()
+{
+ return libraryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getLibraryRootFolderID());
+}
+
+bool LLInventoryModelBackgroundFetch::libraryFetchInProgress()
+{
+ return libraryFetchStarted() && !libraryFetchCompleted();
+}
+
+bool LLInventoryModelBackgroundFetch::inventoryFetchStarted()
+{
+ return mRecursiveInventoryFetchStarted;
+}
+
+bool LLInventoryModelBackgroundFetch::inventoryFetchCompleted()
+{
+ return inventoryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getRootFolderID());
+}
+
+bool LLInventoryModelBackgroundFetch::inventoryFetchInProgress()
+{
+ return inventoryFetchStarted() && !inventoryFetchCompleted();
+}
+
+bool LLInventoryModelBackgroundFetch::isEverythingFetched()
+{
+ return mAllFoldersFetched;
+}
+
+BOOL LLInventoryModelBackgroundFetch::backgroundFetchActive()
+{
+ return mBackgroundFetchActive;
+}
+
+void LLInventoryModelBackgroundFetch::start(const LLUUID& cat_id, BOOL recursive)
+{
+ if (!mAllFoldersFetched)
+ {
+ 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;
+ }
+
+ //DEPRECATED OLD CODE FOLLOWS.
+ // 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;
+ }
+ }
+}
+
+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());
+}
+
+//static Bundle up a bunch of requests to send all at once.
+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..c1e37eda8f
--- /dev/null
+++ b/indra/newview/llinventorymodelbackgroundfetch.h
@@ -0,0 +1,134 @@
+/**
+ * @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
+
+// Seraph clean this up
+#include "llassettype.h"
+#include "llfoldertype.h"
+#include "lldarray.h"
+#include "llframetimer.h"
+#include "llhttpclient.h"
+#include "lluuid.h"
+#include "llpermissionsflags.h"
+#include "llstring.h"
+#include <map>
+#include <set>
+#include <string>
+#include <vector>
+
+// Seraph clean this up
+class LLInventoryObserver;
+class LLInventoryObject;
+class LLInventoryItem;
+class LLInventoryCategory;
+class LLViewerInventoryItem;
+class LLViewerInventoryCategory;
+class LLViewerInventoryItem;
+class LLViewerInventoryCategory;
+class LLMessageSystem;
+class LLInventoryCollectFunctor;
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryModelBackgroundFetch
+//
+// This class handles background fetch.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+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();
+ bool isEverythingFetched();
+ void incrBulkFetch(S16 fetching);
+ void stopBackgroundFetch(); // stop fetch process
+ bool isBulkFetchProcessingComplete();
+
+ // Add categories to a list to be fetched in bulk.
+ void bulkFetch(std::string url);
+
+ bool libraryFetchStarted();
+ bool libraryFetchCompleted();
+ bool libraryFetchInProgress();
+
+ bool inventoryFetchStarted();
+ bool inventoryFetchCompleted();
+ bool inventoryFetchInProgress();
+ void findLostItems();
+
+ void setAllFoldersFetched();
+
+ static void backgroundFetchCB(void*); // background fetch idle function
+ void backgroundFetch();
+
+ struct FetchQueueInfo
+ {
+ FetchQueueInfo(const LLUUID& id, BOOL recursive) :
+ mCatUUID(id), mRecursive(recursive)
+ {
+ }
+ LLUUID mCatUUID;
+ BOOL mRecursive;
+ };
+protected:
+ bool fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id) const;
+private:
+ BOOL mRecursiveInventoryFetchStarted;
+ BOOL mRecursiveLibraryFetchStarted;
+ BOOL mAllFoldersFetched;
+
+ // completing the fetch once per session should be sufficient
+ BOOL mBackgroundFetchActive;
+ S16 mBulkFetchCount;
+ BOOL mTimelyFetchPending;
+ S32 mNumFetchRetries;
+
+ LLFrameTimer mFetchTimer;
+ F32 mMinTimeBetweenFetches;
+ F32 mMaxTimeBetweenFetches;
+
+ 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..8557548887 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,14 @@
#include "llsdutil.h"
#include <deque>
+// If the viewer gets a notification, your observer assumes
+// that that notification is for itself and then tries to process
+// the results. The notification could be for something else (e.g.
+// you're fetching an item and a notification gets triggered because
+// you renamed some other item). This counter is to specify how many
+// notification to wait for before giving up.
+static const U32 MAX_NUM_NOTIFICATIONS_TO_PROCESS = 20;
+
LLInventoryObserver::LLInventoryObserver()
{
}
@@ -72,21 +79,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 +131,7 @@ void LLInventoryCompletionObserver::changed(U32 mask)
}
++it;
}
- if(mIncomplete.empty())
+ if (mIncomplete.empty())
{
done();
}
@@ -103,65 +140,82 @@ 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),
+
+ mNumTries(MAX_NUM_NOTIFICATIONS_TO_PROCESS)
+{
+ mIDs.clear();
+ mIDs.push_back(item_id);
+}
+
+LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const uuid_vec_t& item_ids) :
+ LLInventoryFetchObserver(item_ids),
-void LLInventoryFetchObserver::changed(U32 mask)
+ mNumTries(MAX_NUM_NOTIFICATIONS_TO_PROCESS)
{
+}
+
+void LLInventoryFetchItemsObserver::changed(U32 mask)
+{
+ BOOL any_items_missing = FALSE;
+
// 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 LLUUID& item_id = (*it);
+ LLViewerInventoryItem* item = gInventory.getItem(item_id);
+ if (!item)
{
- if (mRetryIfMissing)
+ any_items_missing = TRUE;
+ if (mNumTries > 0)
{
- // 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.
+ // Keep trying.
++it;
}
else
{
- // BUG: This can cause done() to get called prematurely below.
- // This happens with the LLGestureInventoryFetchObserver that
- // loads gestures at startup. JC
+ // Just concede that this item hasn't arrived in reasonable time and continue on.
+ llwarns << "Fetcher timed out when fetching inventory item assetID:" << item_id << llendl;
it = mIncomplete.erase(it);
}
continue;
}
- if(item->isComplete())
+ if (item->isFinished())
{
- mComplete.push_back(*it);
+ mComplete.push_back(item_id);
it = mIncomplete.erase(it);
continue;
}
++it;
}
- if(mIncomplete.empty())
+ if (any_items_missing)
{
+ mNumTries--;
+ }
+
+ if (mIncomplete.empty())
+ {
+ mNumTries = MAX_NUM_NOTIFICATIONS_TO_PROCESS;
done();
}
}
- //llinfos << "LLInventoryFetchObserver::changed() mComplete size " << mComplete.size() << llendl;
- //llinfos << "LLInventoryFetchObserver::changed() mIncomplete size " << mIncomplete.size() << llendl;
-}
-
-bool LLInventoryFetchObserver::isEverythingComplete() const
-{
- return mIncomplete.empty();
+ //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 +235,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 +255,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 +266,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);
@@ -260,84 +318,88 @@ void LLInventoryFetchObserver::fetchItems(
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 +408,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 +473,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 +486,83 @@ 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;
+ }
+
+ LLPointer<LLViewerInventoryItem> item = new LLViewerInventoryItem;
+ LLMessageSystem* msg = gMessageSystem;
+ 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 +590,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 +605,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 +655,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..6d5a86a6fc 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,238 @@ 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() {};
+ LLInventoryFetchItemsObserver(const LLUUID& item_id = LLUUID::null);
+ LLInventoryFetchItemsObserver(const uuid_vec_t& item_ids);
-protected:
- bool mRetryIfMissing;
- item_ref_t mComplete;
- item_ref_t mIncomplete;
+ /*virtual*/ void startFetch();
+ /*virtual*/ void changed(U32 mask);
+private:
+ S8 mNumTries; // Number of times changed() was called without success
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 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 8097985ade..4766c1c227 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -38,11 +38,14 @@
#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"
@@ -78,7 +81,7 @@ 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),
@@ -97,6 +100,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 != "")
{
@@ -118,16 +122,17 @@ 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);
+ mFolderRoot = LLUICtrlFactory::create<LLFolderView>(p);
+ mFolderRoot->setAllowMultiSelect(mAllowMultiSelect);
}
mCommitCallbackRegistrar.popScope();
- mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
+ mFolderRoot->setCallbackRegistrar(&mCommitCallbackRegistrar);
// Scroller
{
@@ -141,9 +146,9 @@ BOOL LLInventoryPanel::postBuild()
p.tab_stop(true);
mScroller = LLUICtrlFactory::create<LLScrollContainer>(p);
addChild(mScroller);
- mScroller->addChild(mFolders);
- mFolders->setScrollContainer(mScroller);
- mFolders->addChild(mFolders->mStatusTextBox);
+ mScroller->addChild(mFolderRoot);
+ mFolderRoot->setScrollContainer(mScroller);
+ mFolderRoot->addChild(mFolderRoot->mStatusTextBox);
}
// Set up the callbacks from the inventory we're viewing, and then build everything.
@@ -166,16 +171,16 @@ BOOL LLInventoryPanel::postBuild()
{
setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER));
}
- mFolders->setSortOrder(getFilter()->getSortOrder());
+ mFolderRoot->setSortOrder(getFilter()->getSortOrder());
return TRUE;
}
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);
@@ -191,15 +196,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;
}
@@ -227,9 +232,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();
}
}
@@ -243,6 +248,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);
@@ -274,8 +284,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
@@ -292,9 +302,6 @@ void LLInventoryPanel::modelChanged(U32 mask)
bridge->clearDisplayName();
view_item->refresh();
-
- // Set the new tooltip with the new display name.
- view_item->setToolTip(bridge->getDisplayName());
}
}
}
@@ -353,7 +360,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);
}
@@ -368,7 +375,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)
{
@@ -376,7 +383,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
{
@@ -444,14 +451,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);
@@ -462,7 +469,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();
@@ -479,10 +486,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)))
{
@@ -506,19 +513,19 @@ 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;
+ 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
@@ -542,6 +549,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
item->getActualType(),
item->getInventoryType(),
this,
+ mFolderRoot,
item->getUUID(),
item->getFlags());
@@ -552,7 +560,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
params.icon = new_listener->getIcon();
params.icon_open = new_listener->getOpenIcon();
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;
@@ -562,7 +570,7 @@ 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))
@@ -611,19 +619,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;
}
}
@@ -632,7 +640,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;
@@ -645,7 +653,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);
@@ -668,14 +676,15 @@ 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;
@@ -686,20 +695,20 @@ 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.
- mFolders->setEnableScroll(false);
+ mFolderRoot->setEnableScroll(false);
}
// virtual
void LLInventoryPanel::onMouseLeave(S32 x, S32 y, MASK mask)
{
LLPanel::onMouseLeave(x, y, mask);
- mFolders->setEnableScroll(true);
+ 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;
}
@@ -710,39 +719,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)
@@ -761,18 +770,17 @@ void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& it
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;
@@ -785,7 +793,7 @@ bool LLInventoryPanel::beginIMSession()
{
LLUUID item = *iter;
- LLFolderViewItem* folder_item = mFolders->getItemByID(item);
+ LLFolderViewItem* folder_item = mFolderRoot->getItemByID(item);
if(folder_item)
{
@@ -827,7 +835,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();
@@ -869,14 +877,12 @@ bool LLInventoryPanel::beginIMSession()
bool LLInventoryPanel::attachObject(const LLSD& userdata)
{
- std::set<LLUUID> selected_items;
- mFolders->getSelectionList(selected_items);
+ std::set<LLUUID> selected_items = mFolderRoot->getSelectionList();
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(); )
+ 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;
@@ -901,7 +907,7 @@ bool LLInventoryPanel::attachObject(const LLSD& userdata)
{
rez_attachment(item, attachmentp);
}
- 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(attachmentp);
@@ -928,7 +934,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()
@@ -998,3 +1004,30 @@ BOOL LLInventoryPanel::getIsHiddenFolderType(LLFolderType::EType folder_type) co
{
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 928a458b84..4373cedf66 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -133,21 +133,22 @@ 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 setFilterSubString(const std::string& string);
- const std::string getFilterSubString() { return mFolders->getFilterSubString(); }
+ 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);
@@ -162,7 +163,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);
@@ -177,7 +178,7 @@ protected:
LLInventoryObserver* mInventoryObserver;
BOOL mAllowMultiSelect;
- LLFolderView* mFolders;
+ LLFolderView* mFolderRoot;
LLScrollContainer* mScroller;
/**
@@ -199,7 +200,7 @@ public:
static const std::string INHERIT_SORT_ORDER;
void setSortOrder(U32 order);
- U32 getSortOrder() const { return mFolders->getSortOrder(); }
+ U32 getSortOrder() const { return mFolderRoot->getSortOrder(); }
private:
std::string mSortOrderSetting;
diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp
index 2cc5c8335d..9e1dc3a4b0 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"
@@ -482,25 +483,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,25 +626,25 @@ 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());
+ gAgentCamera.unlockView();
+ gAgentCamera.setPanDownKey(getOrbitRate());
}
}
@@ -692,26 +693,26 @@ void LLJoystickCameraZoom::onHeldDown()
if (dy > mVertSlopFar)
{
// Zoom in fast
- gAgent.unlockView();
- gAgent.setOrbitInKey(FAST_RATE);
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitInKey(FAST_RATE);
}
else if (dy > mVertSlopNear)
{
// Zoom in slow
- gAgent.unlockView();
- gAgent.setOrbitInKey(getOrbitRate());
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitInKey(getOrbitRate());
}
else if (dy < -mVertSlopFar)
{
// Zoom out fast
- gAgent.unlockView();
- gAgent.setOrbitOutKey(FAST_RATE);
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitOutKey(FAST_RATE);
}
else if (dy < -mVertSlopNear)
{
// Zoom out slow
- gAgent.unlockView();
- gAgent.setOrbitOutKey(getOrbitRate());
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitOutKey(getOrbitRate());
}
}
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/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 4100e2fc61..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"
@@ -108,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);
@@ -177,6 +178,7 @@ static LLDefaultChildRegistry::Register<LLLocationInputCtrl> r("location_input")
LLLocationInputCtrl::Params::Params()
: 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"),
@@ -186,14 +188,15 @@ LLLocationInputCtrl::Params::Params()
add_landmark_button("add_landmark_button"),
for_sale_button("for_sale_button"),
info_button("info_button"),
- maturity_icon("maturity_icon"),
+ 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")
{
}
@@ -208,7 +211,9 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mLandmarkImageOn(NULL),
mLandmarkImageOff(NULL),
mIconMaturityGeneral(NULL),
- mIconMaturityAdult(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
@@ -227,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);
@@ -277,10 +281,15 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
{
mIconMaturityAdult = p.icon_maturity_adult;
}
+ if(p.icon_maturity_moderate())
+ {
+ mIconMaturityModerate = p.icon_maturity_moderate;
+ }
- LLIconCtrl::Params maturity_icon = p.maturity_icon;
- mMaturityIcon = LLUICtrlFactory::create<LLIconCtrl>(maturity_icon);
- addChild(mMaturityIcon);
+ 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");
@@ -391,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()
@@ -577,7 +586,7 @@ void LLLocationInputCtrl::reshape(S32 width, S32 height, BOOL called_from_parent
if (isHumanReadableLocationVisible)
{
- refreshMaturityIcon();
+ refreshMaturityButton();
}
}
@@ -614,6 +623,11 @@ void LLLocationInputCtrl::onAgentParcelChange()
refresh();
}
+void LLLocationInputCtrl::onMaturityButtonClicked()
+{
+ LLUI::sHelpImpl->showTopic(mMaturityHelpTopic);
+}
+
void LLLocationInputCtrl::onLandmarkLoaded(LLLandmark* lm)
{
(void) lm;
@@ -669,9 +683,8 @@ void LLLocationInputCtrl::onLocationPrearrange(const LLSD& data)
value["item_type"] = TELEPORT_HISTORY;
value["global_pos"] = result->mGlobalPos.getValue();
std::string region_name = result->mTitle.substr(0, result->mTitle.find(','));
- //TODO*: add slurl to teleportitem or parse region name from title
- value["tooltip"] = LLSLURL::buildSLURLfromPosGlobal(region_name,
- result->mGlobalPos, false);
+ //TODO*: add Surl to teleportitem or parse region name from title
+ value["tooltip"] = LLSLURL(region_name, result->mGlobalPos).getSLURLString();
add(result->getTitle(), value);
}
result = std::find_if(result + 1, th_items.end(), boost::bind(
@@ -737,7 +750,7 @@ void LLLocationInputCtrl::refreshLocation()
setText(location_name);
isHumanReadableLocationVisible = true;
- refreshMaturityIcon();
+ refreshMaturityButton();
}
// returns new right edge
@@ -853,37 +866,54 @@ void LLLocationInputCtrl::refreshHealth()
}
}
-void LLLocationInputCtrl::refreshMaturityIcon()
+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:
- mMaturityIcon->setValue(mIconMaturityGeneral->getName());
- mMaturityIcon->setVisible(TRUE);
+ rating_image = mIconMaturityGeneral;
+ rating_tooltip = LLTrans::getString("LocationCtrlGeneralIconTooltip");
break;
case SIM_ACCESS_ADULT:
- mMaturityIcon->setValue(mIconMaturityAdult->getName());
- mMaturityIcon->setVisible(TRUE);
+ rating_image = mIconMaturityAdult;
+ rating_tooltip = LLTrans::getString("LocationCtrlAdultIconTooltip");
+ break;
+
+ case SIM_ACCESS_MATURE:
+ rating_image = mIconMaturityModerate;
+ rating_tooltip = LLTrans::getString("LocationCtrlModerateIconTooltip");
break;
default:
- mMaturityIcon->setVisible(FALSE);
+ button_visible = false;
+ break;
}
- if (mMaturityIcon->getVisible())
+ mMaturityButton->setVisible(button_visible);
+ mMaturityButton->setToolTip(rating_tooltip);
+ if(rating_image)
+ {
+ mMaturityButton->setImageUnselected(rating_image);
+ mMaturityButton->setImagePressed(rating_image);
+ }
+ if (mMaturityButton->getVisible())
{
- positionMaturityIcon();
+ positionMaturityButton();
}
}
-void LLLocationInputCtrl::positionMaturityIcon()
+void LLLocationInputCtrl::positionMaturityButton()
{
const LLFontGL* font = mTextEntry->getFont();
if (!font)
@@ -895,11 +925,11 @@ void LLLocationInputCtrl::positionMaturityIcon()
// Calculate the right edge of rendered text + a whitespace.
left_pad = left_pad + font->getWidth(mTextEntry->getText()) + font->getWidth(" ");
- LLRect rect = mMaturityIcon->getRect();
- mMaturityIcon->setRect(rect.setOriginAndSize(left_pad, rect.mBottom, rect.getWidth(), rect.getHeight()));
+ 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.
- mMaturityIcon->setVisible(rect.mRight < mTextEntry->getRect().getWidth() - right_pad);
+ mMaturityButton->setVisible(rect.mRight < mTextEntry->getRect().getWidth() - right_pad);
}
void LLLocationInputCtrl::rebuildLocationHistory(const std::string& filter)
@@ -1012,10 +1042,12 @@ void LLLocationInputCtrl::changeLocationPresentation()
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();
- mMaturityIcon->setVisible(FALSE);
+ mMaturityButton->setVisible(FALSE);
isHumanReadableLocationVisible = false;
}
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index f790140f07..fc7adf60b0 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -66,17 +66,19 @@ public:
{
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> maturity_icon,
- voice_icon,
+ Optional<LLIconCtrl::Params> voice_icon,
fly_icon,
push_icon,
build_icon,
@@ -136,8 +138,8 @@ private:
void refreshParcelIcons();
// Refresh the value in the health percentage text field
void refreshHealth();
- void refreshMaturityIcon();
- void positionMaturityIcon();
+ void refreshMaturityButton();
+ void positionMaturityButton();
void rebuildLocationHistory(const std::string& filter = LLStringUtil::null);
bool findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter);
@@ -156,6 +158,7 @@ private:
void onForSaleButtonClicked();
void onAddLandmarkButtonClicked();
void onAgentParcelChange();
+ void onMaturityButtonClicked();
// callbacks
bool onLocationContextMenuItemEnabled(const LLSD& userdata);
void onLocationContextMenuItemClicked(const LLSD& userdata);
@@ -168,7 +171,7 @@ private:
S32 mIconHPad; // pad between all icons
S32 mAddLandmarkHPad; // pad to left of landmark star
- LLIconCtrl* mMaturityIcon;
+ LLButton* mMaturityButton;
LLIconCtrl* mParcelIcon[ICON_COUNT];
LLTextBox* mDamageText;
@@ -182,14 +185,16 @@ private:
boost::signals2::connection mLocationHistoryConnection;
LLUIImage* mLandmarkImageOn;
LLUIImage* mLandmarkImageOff;
- LLUIImage* mIconMaturityGeneral;
- LLUIImage* mIconMaturityAdult;
+ 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/llloginhandler.cpp b/indra/newview/llloginhandler.cpp
index e3817eecc4..4e0a7594ba 100644
--- a/indra/newview/llloginhandler.cpp
+++ b/indra/newview/llloginhandler.cpp
@@ -35,13 +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"
@@ -60,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")
+ if (queryMap.has("grid"))
{
- grid_choice = GRID_INFO_NANDI;
+ LLGridManager::getInstance()->setGridChoice(queryMap["grid"].asString());
}
- else if (queryMap["grid"].asString() == "mitra")
- {
- grid_choice = GRID_INFO_MITRA;
- }
- 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.empty()) // "last" or "home" or ??? (let LLURLSimString figure it out)
+ else if (startLocation == "home")
{
- LLURLSimString::setString(startLocation);
+ LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME));
+ }
+ else if (startLocation == "last")
+ {
+ LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_LAST));
}
}
@@ -220,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
- {
- 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;
+
+// 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)
+ {
+
+ 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/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 05cb6ddc4a..7a4ed74c4c 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -78,8 +78,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
mBorder(NULL),
mFrequentUpdates( true ),
mForceUpdate( false ),
- mOpenLinksInExternalBrowser( false ),
- mOpenLinksInInternalBrowser( false ),
mHomePageUrl( "" ),
mTrusted(false),
mIgnoreUIScale( true ),
@@ -167,20 +165,6 @@ 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)
@@ -944,7 +928,6 @@ 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;
@@ -979,95 +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 (target_type == LLPluginClassMedia::TARGET_EXTERNAL ||
- target_type == LLPluginClassMedia::TARGET_BLANK )
- {
- if (gSavedSettings.getBOOL("UseExternalBrowser"))
- {
- LLSD payload;
- payload["url"] = url;
- payload["target_type"] = LLSD::Integer(target_type);
- LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, onClickLinkExternalTarget);
- }
- else
- {
- 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 (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;
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
std::string LLMediaCtrl::getCurrentNavUrl()
{
return mCurrentNavUrl;
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index e55d2f7cd0..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,24 +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 );
-
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/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 1853b511be..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"
@@ -90,12 +91,20 @@ BOOL LLFloaterMove::postBuild()
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));
@@ -124,8 +133,6 @@ BOOL LLFloaterMove::postBuild()
btn = getChild<LLButton>("mode_fly_btn");
btn->setCommitCallback(boost::bind(&LLFloaterMove::onFlyButtonClick, this));
- showFlyControls(false);
-
initModeTooltips();
initModeButtonMap();
@@ -199,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)
{
@@ -331,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);
@@ -339,33 +351,38 @@ void LLFloaterMove::setMovementMode(const EMovementMode mode)
void LLFloaterMove::updateButtonsWithMovementMode(const EMovementMode newMode)
{
- showFlyControls(MM_FLY == newMode);
setModeTooltip(newMode);
setModeButtonToggleState(newMode);
setModeTitle(newMode);
}
-void LLFloaterMove::showFlyControls(bool bShow)
-{
- mMoveUpButton->setVisible(bShow);
- mMoveDownButton->setVisible(bShow);
-}
-
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);
@@ -387,9 +404,9 @@ void LLFloaterMove::initMovementMode()
}
setMovementMode(initMovementMode);
- if (gAgent.getAvatarObject())
+ if (isAgentAvatarValid())
{
- setEnabled(!gAgent.getAvatarObject()->isSitting());
+ setEnabled(!gAgentAvatarp->isSitting());
}
}
@@ -490,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);
@@ -593,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)
{
@@ -695,6 +712,7 @@ void LLPanelStandStopFlying::onStandButtonClick()
gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
setFocus(FALSE); // EXT-482
+ 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 dcca8308d9..fcf643f050 100644
--- a/indra/newview/llmoveview.h
+++ b/indra/newview/llmoveview.h
@@ -88,7 +88,6 @@ private:
void onFlyButtonClick();
void initMovementMode();
void setMovementMode(const EMovementMode mode);
- void showFlyControls(bool bShow);
void initModeTooltips();
void setModeTooltip(const EMovementMode mode);
void setModeTitle(const EMovementMode mode);
@@ -102,6 +101,8 @@ public:
LLJoystickAgentTurn* mForwardButton;
LLJoystickAgentTurn* mBackwardButton;
+ LLJoystickAgentSlide* mSlideLeftButton;
+ LLJoystickAgentSlide* mSlideRightButton;
LLButton* mTurnLeftButton;
LLButton* mTurnRightButton;
LLButton* mMoveUpButton;
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 883d4cdf4b..d605d4430e 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -81,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
@@ -142,21 +142,36 @@ void LLNameListCtrl::showInspector(const LLUUID& avatar_id, bool is_group)
void LLNameListCtrl::mouseOverHighlightNthItem( S32 target_index )
{
- if (getHighlightedItemInx()!= target_index)
+ S32 cur_index = getHighlightedItemInx();
+ if (cur_index != target_index)
{
- if(getHighlightedItemInx()!=-1)
+ if(0 <= cur_index && cur_index < (S32)getItemList().size())
{
- LLScrollListItem* item = getItemList()[getHighlightedItemInx()];
- LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex));
- if(cell)
- cell->setTextWidth(cell->getTextWidth() + info_icon_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(cell)
- cell->setTextWidth(cell->getTextWidth() - info_icon_size);
+ if (item)
+ {
+ if (cell)
+ cell->setTextWidth(cell->getTextWidth() - info_icon_size);
+ }
+ else
+ {
+ llwarns << "target name item is NULL" << llendl;
+ }
}
}
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index e11df06d86..251c60b5bf 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -52,7 +52,6 @@
#include "llsearchcombobox.h"
#include "llsidetray.h"
#include "llslurl.h"
-#include "llurlsimstring.h"
#include "llurlregistry.h"
#include "llurldispatcher.h"
#include "llviewerinventory.h"
@@ -375,7 +374,6 @@ void LLNavigationBar::draw()
if(mPurgeTPHistoryItems)
{
LLTeleportHistory::getInstance()->purgeItems();
- onTeleportHistoryChanged();
mPurgeTPHistoryItems = false;
}
@@ -508,29 +506,34 @@ void LLNavigationBar::onLocationSelection()
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;
+ region_name = slurl.getRegion();
+ local_coords = slurl.getPosition();
}
- // 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.
- else if (LLUrlRegistry::instance().isUrl(typed_location))
+ else if(!slurl.isValid())
{
+ // 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
{
- // assume that an user has typed the {region name} or possible {region_name, parcel}
- region_name = typed_location.substr(0,typed_location.find(','));
+ // was an app slurl, home, whatever. Bail
+ return;
}
// Resolve the region name to its global coordinates.
@@ -562,7 +565,7 @@ 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_SLURL);// we can add into history only TYPED location
@@ -651,7 +654,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);
}
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index c8d5d782b7..f1c13de8bb 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -107,7 +107,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);
@@ -207,7 +209,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);
}
@@ -351,3 +353,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 483756b16e..680ed35fa2 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -69,6 +69,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 +106,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 +117,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 +140,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 +151,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 +160,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 +180,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 +213,7 @@ void LLGestureComboList::hideList()
mButton->setToggleState(FALSE);
mList->setVisible(FALSE);
mList->mouseOverHighlightNthItem(-1);
+ LLUI::removePopup(mList);
gFocusMgr.setKeyboardFocus(NULL);
}
}
@@ -247,8 +273,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 +289,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 +321,7 @@ void LLGestureComboList::refreshGestures()
gesture = mGestures.at(index);
}
- if(gesture && LLGestureManager::instance().isGesturePlaying(gesture))
+ if(gesture && LLGestureMgr::instance().isGesturePlaying(gesture))
{
return;
}
@@ -321,10 +350,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 +370,7 @@ void LLGestureComboList::onCommitGesture()
LLGestureComboList::~LLGestureComboList()
{
- LLGestureManager::instance().removeObserver(this);
+ LLGestureMgr::instance().removeObserver(this);
}
LLNearbyChatBar::LLNearbyChatBar()
@@ -479,7 +514,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
@@ -561,7 +596,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
{
@@ -810,8 +845,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 559c1ee091..5af3152662 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);
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index 08ae93c3a6..9824517ed1 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -56,7 +56,6 @@ LLToastPanelBase* createToastPanel()
return item;
}
-
class LLNearbyChatScreenChannel: public LLScreenChannelBase
{
public:
@@ -88,11 +87,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();
};
@@ -105,6 +100,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;
@@ -132,11 +135,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();
}
@@ -228,7 +232,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();
}
@@ -240,7 +244,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()
@@ -252,40 +263,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() + 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 - toast->getTopPad();
- }
}
}
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 05623198ab..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(),
@@ -203,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;
@@ -264,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]);
@@ -289,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;
@@ -461,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
@@ -529,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/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index a163b6fd62..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
@@ -291,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().
@@ -298,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,
@@ -343,6 +365,29 @@ public:
* Adds notification panel to the IM floater.
*/
static void addNotifPanelToIM(const LLNotificationPtr& notification);
+
+ /**
+ * 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 LLIMFloater* findIMFloater(const LLNotificationPtr& notification);
+
};
}
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index 88bb769109..95b946f307 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -114,8 +114,7 @@ void LLSysHandler::removeExclusiveNotifications(const LLNotificationPtr& 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"),
@@ -127,7 +126,10 @@ const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),
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)
@@ -137,11 +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
@@ -151,26 +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()
- || USER_GIVE_ITEM == 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)
@@ -179,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
{
@@ -201,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())
@@ -227,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)
{
@@ -250,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());
}
}
}
@@ -296,6 +384,7 @@ 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);
}
}
@@ -324,7 +413,16 @@ std::string LLHandlerUtil::getSubstitutionName(const LLNotificationPtr& notifica
if (res.empty())
{
LLUUID from_id = notification->getPayload()["FROM_ID"];
- gCacheName->getFullName(from_id, res);
+
+ //*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;
}
@@ -343,11 +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::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);
+
+ 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 8ebd5de258..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,6 +176,11 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
}
else
{
+ if (LLHandlerUtil::canAddNotifPanelToIM(notification)
+ && !LLHandlerUtil::isIMFloaterOpened(notification))
+ {
+ LLHandlerUtil::decIMMesageCounter(notification);
+ }
mChannel->killToastByNotificationID(notification->getID());
}
}
@@ -166,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
@@ -181,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 4e2c5085ed..df6f04b6ea 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -41,41 +41,10 @@
#include "llviewercontrol.h"
#include "llviewerwindow.h"
#include "llnotificationmanager.h"
+#include "llpaneltiptoast.h"
using namespace LLNotificationsUI;
-class LLOnlineStatusToast : public LLToastPanel
-{
-public:
-
- struct Params
- {
- LLNotificationPtr notification;
- LLUUID avatar_id;
- std::string message;
-
- Params() {}
- };
-
- LLOnlineStatusToast(Params& p) : LLToastPanel(p.notification)
- {
- LLUICtrlFactory::getInstance()->buildPanel(this, "panel_online_status_toast.xml");
-
- childSetValue("avatar_icon", p.avatar_id);
- childSetValue("message", p.message);
-
- if (p.notification->getPayload().has("respond_on_mousedown")
- && p.notification->getPayload()["respond_on_mousedown"] )
- {
- setMouseDownCallback(boost::bind(&LLNotification::respond, p.notification,
- p.notification->getResponseTemplate()));
- }
-
- // set line max count to 2 in case of a very long name
- snapToMessageHeight(getChild<LLTextBox>("message"), 2);
- }
-};
-
//--------------------------------------------------------------------------
LLTipHandler::LLTipHandler(e_notification_type type, const LLSD& id)
{
@@ -150,20 +119,14 @@ bool LLTipHandler::processNotification(const LLSD& notify)
LLHandlerUtil::spawnIMSession(name, from_id);
}
- LLToastPanel* notify_box = NULL;
- if("FriendOffline" == notification->getName() || "FriendOnline" == notification->getName())
- {
- LLOnlineStatusToast::Params p;
- p.notification = notification;
- p.message = notification->getMessage();
- p.avatar_id = notification->getPayload()["FROM_ID"];
- notify_box = new LLOnlineStatusToast(p);
- }
- else
+ // don't spawn toast for inventory accepted/declined offers if respective IM window is open (EXT-5909)
+ if (!LLHandlerUtil::canSpawnToast(notification))
{
- notify_box = new LLToastNotifyPanel(notification);
+ return true;
}
+ LLToastPanel* notify_box = LLToastPanel::buidPanelFromNotification(notification);
+
LLToast::Params p;
p.notif_id = notification->getID();
p.notification = notification;
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
new file mode 100644
index 0000000000..17a2db7a43
--- /dev/null
+++ b/indra/newview/lloutfitslist.cpp
@@ -0,0 +1,504 @@
+/**
+ * @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 "lltransutil.h"
+#include "llviewermenu.h"
+#include "llvoavatar.h"
+#include "llvoavatarself.h"
+#include "llwearableitemslist.h"
+
+//////////////////////////////////////////////////////////////////////////
+
+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));
+ // *TODO: implement this
+ // registrar.add("Outfit.Rename", boost::bind());
+ // registrar.add("Outfit.Delete", boost::bind());
+
+ return createFromFile("menu_outfit_tab.xml");
+ }
+};
+
+//////////////////////////////////////////////////////////////////////////
+
+static LLRegisterPanelClassWrapper<LLOutfitsList> t_outfits_list("outfits_list");
+
+LLOutfitsList::LLOutfitsList()
+ : LLPanel()
+ , mAccordion(NULL)
+ , mListCommands(NULL)
+ , mSelectedList(NULL)
+{
+ mCategoriesObserver = new LLInventoryCategoriesObserver();
+ gInventory.addObserver(mCategoriesObserver);
+
+ gInventory.addObserver(this);
+
+ mOutfitMenu = new OutfitContextMenu();
+}
+
+LLOutfitsList::~LLOutfitsList()
+{
+ delete mOutfitMenu;
+
+ if (gInventory.containsObserver(mCategoriesObserver))
+ {
+ gInventory.removeObserver(mCategoriesObserver);
+ delete mCategoriesObserver;
+ }
+
+ if (gInventory.containsObserver(this))
+ {
+ gInventory.removeObserver(this);
+ }
+}
+
+BOOL LLOutfitsList::postBuild()
+{
+ mAccordion = getChild<LLAccordionCtrl>("outfits_accordion");
+
+ return TRUE;
+}
+
+//virtual
+void LLOutfitsList::changed(U32 mask)
+{
+ if (!gInventory.isInventoryUsable())
+ return;
+
+ const LLUUID outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ LLViewerInventoryCategory* category = gInventory.getCategory(outfits);
+ if (!category)
+ return;
+
+ // Start observing changes in "My Outfits" category.
+ mCategoriesObserver->addCategory(outfits,
+ boost::bind(&LLOutfitsList::refreshList, this, outfits));
+
+ // 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);
+
+ // This observer is used to start the initial outfits fetch
+ // when inventory becomes usable. It is no longer needed because
+ // "My Outfits" category is now observed by
+ // LLInventoryCategoriesObserver.
+ gInventory.removeObserver(this);
+}
+
+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->setRightMouseDownCallback(boost::bind(&LLOutfitsList::onAccordionTabRightClick, this,
+ _1, _2, _3, cat_id));
+
+ 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));
+
+ // 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));
+
+ // 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())
+ {
+ // An outfit is removed from the list. Do the following:
+ // 1. Remove outfit accordion tab from accordion.
+ mAccordion->removeCollapsibleCtrl(outfits_iter->second);
+
+ const LLUUID& outfit_id = outfits_iter->first;
+
+ // 2. Remove outfit category from observer to stop monitoring its changes.
+ mCategoriesObserver->removeCategory(outfit_id);
+
+ // 3. Reset selection if selected outfit is being removed.
+ if (mSelectedOutfitUUID == outfit_id)
+ {
+ changeOutfitSelection(NULL, LLUUID());
+ }
+
+ // 4. Remove category UUID to accordion tab mapping.
+ mOutfitsMap.erase(outfits_iter);
+ }
+ }
+
+ // 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->arrange();
+}
+
+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)
+{
+ 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 );
+ }
+}
+
+void LLOutfitsList::setFilterSubString(const std::string& string)
+{
+ applyFilter(string);
+
+ mFilterSubString = string;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// 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)
+{
+ // Reset selection in previously selected tab
+ // if a new one is selected.
+ if (list && mSelectedList && mSelectedList != list)
+ {
+ mSelectedList->resetSelection();
+ }
+
+ mSelectedList = list;
+ mSelectedOutfitUUID = 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;
+
+ std::string title = tab->getTitle();
+ LLStringUtil::toUpper(title);
+
+ std::string cur_filter = mFilterSubString;
+ LLStringUtil::toUpper(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);
+ }
+ else
+ {
+ tab->setTitle(tab->getTitle(), cur_filter);
+ }
+ }
+}
+
+void LLOutfitsList::applyFilter(const std::string& 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())
+ {
+ std::string title = tab->getTitle();
+ LLStringUtil::toUpper(title);
+
+ std::string cur_filter = new_filter_substring;
+ LLStringUtil::toUpper(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);
+ }
+ else
+ {
+ tab->setTitle(tab->getTitle(), cur_filter);
+ }
+
+ 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"));
+ }
+ }
+}
+
+void LLOutfitsList::onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id)
+{
+ LLAccordionCtrlTab* tab = dynamic_cast<LLAccordionCtrlTab*>(ctrl);
+ if(mOutfitMenu && tab && tab->getHeaderVisible() && cat_id.notNull())
+ {
+ S32 header_bottom = tab->getLocalRect().getHeight() - tab->getHeaderHeight();
+ if(y >= header_bottom)
+ {
+ uuid_vec_t selected_uuids;
+ selected_uuids.push_back(cat_id);
+ mOutfitMenu->show(ctrl, selected_uuids, x, y);
+ }
+ }
+}
+
+// EOF
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
new file mode 100644
index 0000000000..b6b3d6ae46
--- /dev/null
+++ b/indra/newview/lloutfitslist.h
@@ -0,0 +1,128 @@
+/**
+ * @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 "llpanel.h"
+
+// newview
+#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
+
+class LLAccordionCtrl;
+class LLAccordionCtrlTab;
+class LLWearableItemsList;
+class LLListContextMenu;
+
+/**
+ * @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.
+ * Uses LLInventoryCategoriesObserver to monitor changes to "My Outfits"
+ * inventory category and refresh the outfits listed in it.
+ * This class is derived from LLInventoryObserver to know when inventory
+ * becomes usable and it is safe to request data from inventory model.
+ */
+class LLOutfitsList : public LLPanel, public LLInventoryObserver
+{
+public:
+ LLOutfitsList();
+ virtual ~LLOutfitsList();
+
+ /*virtual*/ BOOL postBuild();
+
+ /*virtual*/ void changed(U32 mask);
+
+ void refreshList(const LLUUID& category_id);
+
+ void onSelectionChange(LLUICtrl* ctrl);
+
+ void performAction(std::string action);
+
+ void setFilterSubString(const std::string& string);
+
+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);
+
+ /**
+ * 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);
+
+ void onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id);
+
+ LLInventoryCategoriesObserver* mCategoriesObserver;
+
+ LLAccordionCtrl* mAccordion;
+ LLPanel* mListCommands;
+
+ LLWearableItemsList* mSelectedList;
+ LLUUID mSelectedOutfitUUID;
+
+ 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;
+};
+
+#endif //LL_LLOUTFITSLIST_H
diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp
index d6d48a4ead..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));
}
}
diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h
index b7454a5066..3a83da67e2 100644
--- a/indra/newview/lloutputmonitorctrl.h
+++ b/indra/newview/lloutputmonitorctrl.h
@@ -143,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 57b478ffef..0b31ffc9a0 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -51,6 +51,7 @@
#include "llnotificationsutil.h"
#include "llvoiceclient.h"
#include "llnamebox.h"
+#include "lltrans.h"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLDropTarget
@@ -163,7 +164,7 @@ BOOL LLPanelAvatarNotes::postBuild()
resetControls();
resetData();
- gVoiceClient->addObserver((LLVoiceClientStatusObserver*)this);
+ LLVoiceClient::getInstance()->addObserver((LLVoiceClientStatusObserver*)this);
return TRUE;
}
@@ -374,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)
@@ -495,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));
@@ -504,6 +506,7 @@ 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.EnableBlock", boost::bind(&LLPanelAvatarProfile::enableBlock, this));
enable.add("Profile.EnableUnblock", boost::bind(&LLPanelAvatarProfile::enableUnblock, this));
@@ -516,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();
@@ -643,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 );
@@ -698,6 +705,15 @@ void LLPanelAvatarProfile::toggleBlock()
LLAvatarActions::toggleBlock(getAvatarId());
}
+bool LLPanelAvatarProfile::enableShowOnMap()
+{
+ 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;
+}
+
bool LLPanelAvatarProfile::enableBlock()
{
return LLAvatarActions::canBlock(getAvatarId()) && !LLAvatarActions::isBlocked(getAvatarId());
@@ -798,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 2bd23b6e9c..bb8df2ff9c 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -202,6 +202,7 @@ protected:
void unfreeze();
void csr();
+ bool enableShowOnMap();
bool enableBlock();
bool enableUnblock();
bool enableGod();
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 021e1f5159..70a7bf644b 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -1893,7 +1893,7 @@ void LLPanelClassifiedEdit::resetControls()
LLPanelClassifiedInfo::resetControls();
getChild<LLComboBox>("category")->setCurrentByIndex(0);
- getChild<LLIconsComboBox>("content_type")->setCurrentByIndex(0);
+ getChild<LLComboBox>("content_type")->setCurrentByIndex(0);
childSetValue("auto_renew", false);
childSetValue("price_for_listing", MINIMUM_PRICE_FOR_LISTING);
childSetEnabled("price_for_listing", TRUE);
@@ -1928,7 +1928,7 @@ U32 LLPanelClassifiedEdit::getContentType()
void LLPanelClassifiedEdit::setContentType(U32 content_type)
{
- LLIconsComboBox* ct_cb = getChild<LLIconsComboBox>("content_type");
+ LLComboBox* ct_cb = getChild<LLComboBox>("content_type");
ct_cb->setCurrentByIndex(content_type);
ct_cb->resetDirty();
}
@@ -1988,7 +1988,7 @@ U8 LLPanelClassifiedEdit::getFlags()
{
bool auto_renew = childGetValue("auto_renew").asBoolean();
- LLComboBox* content_cb = getChild<LLIconsComboBox>("content_type");
+ LLComboBox* content_cb = getChild<LLComboBox>("content_type");
bool mature = content_cb->getCurrentIndex() == CB_ITEM_MATURE;
return pack_classified_flags_request(auto_renew, false, mature, false);
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..9eccceca66 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -50,6 +50,15 @@
#include "llaccordionctrltab.h"
#include "llagentwearables.h"
#include "llscrollingpanelparam.h"
+#include "llradiogroup.h"
+
+#include "llcolorswatch.h"
+#include "lltexturectrl.h"
+#include "lltextureentry.h"
+#include "llviewercontrol.h" // gSavedSettings
+#include "llviewertexturelist.h"
+#include "llagentcamera.h"
+#include "llmorphview.h"
// register panel with appropriate XML
static LLRegisterPanelClassWrapper<LLPanelEditWearable> t_edit_wearable("panel_edit_wearable");
@@ -88,6 +97,8 @@ enum ESubpart {
SUBPART_TATTOO
};
+using namespace LLVOAvatarDefines;
+
typedef std::vector<ESubpart> subpart_vec_t;
// Locally defined classes
@@ -107,25 +118,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 +172,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 +215,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 +249,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 +325,279 @@ 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)
+ {
+ color_swatch_ctrl->setOriginal(self->getWearable()->getClothesColor(entry->mTextureIndex));
+ }
+}
+
+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
@@ -295,6 +622,8 @@ BOOL LLPanelEditWearable::postBuild()
mPanelTitle = getChild<LLTextBox>("edit_wearable_title");
mDescTitle = getChild<LLTextBox>("description_text");
+ getChild<LLRadioGroup>("sex_radio")->setCommitCallback(boost::bind(&LLPanelEditWearable::onCommitSexChange, 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 +644,16 @@ 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");
+
return TRUE;
}
@@ -338,8 +675,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();
}
@@ -361,6 +702,136 @@ void LLPanelEditWearable::onRevertButtonClicked(void* userdata)
}
+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()
{
if (!mWearablePtr || !isDirty())
@@ -401,7 +872,10 @@ 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;
@@ -424,6 +898,73 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show)
mDescTitle->setText(description_title);
}
+ // 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));
+
+ showDefaultSubpart();
+}
+
+void LLPanelEditWearable::showDefaultSubpart()
+{
+ changeCamera(0);
+}
+
+void LLPanelEditWearable::onTabExpandedCollapsed(const LLSD& param, U8 index)
+{
+ bool expanded = param.asBoolean();
+
+ if (!mWearablePtr || !gAgentCamera.cameraCustomizeAvatar())
+ {
+ // we don't have a valid wearable we're editing, or we've left the wearable editor
+ return;
+ }
+
+ if (expanded)
+ {
+ changeCamera(index);
+ }
+
+}
+
+void LLPanelEditWearable::changeCamera(U8 subpart)
+{
+ const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(mWearablePtr->getType());
+ if (!wearable_entry)
+ {
+ llinfos << "could not get wearable dictionary entry for wearable type: " << mWearablePtr->getType() << llendl;
+ return;
+ }
+
+ if (subpart >= wearable_entry->mSubparts.size())
+ {
+ llinfos << "accordion tab expanded for invalid subpart. Wearable type: " << mWearablePtr->getType() << " subpart num: " << subpart << llendl;
+ return;
+ }
+
+ ESubpart subpart_e = wearable_entry->mSubparts[subpart];
+ 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;
+ return;
+ }
+
+ // 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();
+ }
+}
+
+void LLPanelEditWearable::updateScrollingPanelList()
+{
+ updateScrollingPanelUI();
}
void LLPanelEditWearable::initializePanel()
@@ -434,11 +975,14 @@ void LLPanelEditWearable::initializePanel()
return;
}
- EWearableType type = mWearablePtr->getType();
+ LLWearableType::EType type = mWearablePtr->getType();
// set name
mTextEditor->setText(mWearablePtr->getName());
+ // toggle wearable type-specific controls
+ toggleTypeSpecificControls(type);
+
// clear and rebuild visual param list
const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type);
if (!wearable_entry)
@@ -481,6 +1025,9 @@ void LLPanelEditWearable::initializePanel()
// what edit group do we want to extract params for?
const std::string edit_group = subpart_entry->mEditGroup;
+ // initialize callback to ensure camera view changes appropriately.
+ tab->setDropDownStateChangedCallback(boost::bind(&LLPanelEditWearable::onTabExpandedCollapsed,this,_2,index));
+
// storage for ordered list of visual params
value_map_t sorted_params;
getSortedParams(sorted_params, edit_group);
@@ -489,7 +1036,49 @@ void LLPanelEditWearable::initializePanel()
updateScrollingPanelUI();
}
-
+
+ // 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));
+
+ showDefaultSubpart();
+ updateVerbs();
+
+ if (getWearable())
+ {
+ LLWearableType::EType type = getWearable()->getType();
+ updatePanelPickerControls(type);
+ updateTypeSpecificControls(type);
+ }
+}
+
+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);
+ }
+}
+
+void LLPanelEditWearable::updateTypeSpecificControls(LLWearableType::EType type)
+{
+ // Update controls specific to shape editing panel.
+ if (type == LLWearableType::WT_SHAPE)
+ {
+ // Update avatar height
+ std::string avatar_height_str = llformat("%.2f", gAgentAvatarp->mBodySize.mV[VZ]);
+ mTxtAvatarHeight->setTextArg("[HEIGHT]", avatar_height_str);
+ }
+
+ if (LLWearableType::WT_ALPHA == type)
+ {
+ updateAlphaCheckboxes();
+
+ initPreviousAlphaTextures();
+ }
}
void LLPanelEditWearable::updateScrollingPanelUI()
@@ -500,7 +1089,7 @@ void LLPanelEditWearable::updateScrollingPanelUI()
return;
}
- EWearableType type = mWearablePtr->getType();
+ LLWearableType::EType type = mWearablePtr->getType();
LLPanel *panel = getPanel(type);
if(panel && (mWearablePtr->getItemID().notNull()))
@@ -530,67 +1119,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 +1191,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);
@@ -640,18 +1229,112 @@ 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());
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();
+ }
+}
+// EOF
diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h
index 4178659617..b6b8c0c781 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,11 +36,14 @@
#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;
@@ -62,7 +65,14 @@ public:
void saveChanges();
void revertChanges();
+ void showDefaultSubpart();
+ void onTabExpandedCollapsed(const LLSD& param, U8 index);
+
+ void updateScrollingPanelList();
+
static void onRevertButtonClicked(void* userdata);
+ void onCommitSexChange();
+
private:
typedef std::map<F32, LLViewerVisualParam*> value_map_t;
@@ -70,12 +80,31 @@ private:
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);
+ // 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);
// 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,6 +112,7 @@ private:
LLTextBox *mPanelTitle;
LLTextBox *mDescTitle;
+ LLTextBox *mTxtAvatarHeight;
// This text editor reference will change each time we edit a new wearable -
@@ -109,6 +139,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/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 706787e824..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,8 +92,7 @@ LLPanelGroup::LLPanelGroup()
: LLPanel(),
LLGroupMgrObserver( LLUUID() ),
mSkipRefresh(FALSE),
- mButtonJoin(NULL),
- mShowingNotifyDialog(false)
+ mButtonJoin(NULL)
{
// Set up the factory callbacks.
// Roles sub tabs
@@ -199,7 +200,7 @@ BOOL LLPanelGroup::postBuild()
mJoinText = panel_general->getChild<LLUICtrl>("join_cost_text");
}
- gVoiceClient->addObserver(this);
+ LLVoiceClient::getInstance()->addObserver(this);
return TRUE;
}
@@ -320,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()
@@ -333,8 +334,9 @@ void LLPanelGroup::update(LLGroupChange gc)
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);
LLGroupData agent_gdatap;
bool is_member = gAgent.getGroupData(mID,agent_gdatap) || gAgent.isGodlike();
@@ -379,8 +381,9 @@ 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");
@@ -625,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 136868a60d..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;
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index 517204b232..555248e31a 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -212,7 +212,6 @@ void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group)
if (mInsignia)
{
mInsignia->setCommitCallback(onCommitAny, this);
- mDefaultIconID = mInsignia->getImageAssetID();
}
mFounderName = getChild<LLNameBox>("founder_name");
@@ -656,7 +655,7 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
}
else
{
- mInsignia->setImageAssetID(mDefaultIconID);
+ mInsignia->setImageAssetName(mInsignia->getDefaultImageName());
}
}
@@ -820,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);
@@ -846,6 +845,8 @@ void LLPanelGroupGeneral::reset()
mInsignia->setEnabled(true);
+ mInsignia->setImageAssetName(mInsignia->getDefaultImageName());
+
{
std::string empty_str = "";
mEditCharter->setText(empty_str);
@@ -934,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");
diff --git a/indra/newview/llpanelgroupgeneral.h b/indra/newview/llpanelgroupgeneral.h
index 6245018871..6f4fa994da 100644
--- a/indra/newview/llpanelgroupgeneral.h
+++ b/indra/newview/llpanelgroupgeneral.h
@@ -95,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 05261a65de..11d3768a3d 100644
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -57,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();
@@ -69,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);
@@ -111,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;
@@ -361,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;
@@ -399,7 +399,7 @@ 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++)
@@ -456,7 +456,7 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)
void LLPanelGroupInvite::addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name)
{
std::vector<std::string> names;
- std::vector<LLUUID> agent_ids;
+ 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);
diff --git a/indra/newview/llpanelgroupinvite.h b/indra/newview/llpanelgroupinvite.h
index b095dd2395..2ed443ed46 100644
--- a/indra/newview/llpanelgroupinvite.h
+++ b/indra/newview/llpanelgroupinvite.h
@@ -42,7 +42,7 @@ 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().
*/
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 5f913d5469..42ff514f09 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,14 +330,15 @@ 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(),
+ inv_item->getIsLinkType(),
item_is_multi );
mCreateInventoryIcon->setValue(icon_name);
@@ -516,6 +518,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 +533,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 +553,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 +575,7 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg)
mNoticesList->addElement(row, ADD_BOTTOM);
}
+ mNoticesList->setNeedsSort(save_sort);
mNoticesList->updateSort();
}
@@ -606,9 +621,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);
@@ -655,6 +669,9 @@ void LLPanelGroupNotices::setGroupID(const LLUUID& id)
if(mViewMessage)
mViewMessage->clear();
+
+ if(mViewInventoryName)
+ mViewInventoryName->clear();
activate();
}
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index c6287472fe..b356fe6bfd 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,37 @@ 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();
+
+ 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 +858,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 +924,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 +951,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 +1008,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 +1083,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 +1104,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 +1436,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 +1749,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 +2084,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 +2205,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 c34f0633b9..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);
@@ -124,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;
}
diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
index 56d52ccc65..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"
@@ -383,22 +384,44 @@ std::string LLPanelLandmarkInfo::getFullFolderName(const LLViewerInventoryCatego
if (cat)
{
name = cat->getName();
-
- // 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())
- {
- LLTrans::findString(name, "InvFolder " + name);
- }
+ 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())
+ while ((parent_id = cat->getParentUUID()).notNull())
{
cat = gInventory.getCategory(parent_id);
llassert(cat);
if (cat)
{
- name = cat->getName() + "/" + name;
+ 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;
+ }
}
}
}
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 45a8dc4cbe..4bf4f9eac1 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"
@@ -279,6 +280,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()
{
@@ -297,6 +309,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())
@@ -304,7 +335,8 @@ void LLLandmarksPanel::updateVerbs()
bool landmark_selected = isLandmarkSelected();
mTeleportBtn->setEnabled(landmark_selected && isActionEnabled("teleport"));
- mShowOnMapBtn->setEnabled(landmark_selected && isActionEnabled("show_on_map"));
+ mShowProfile->setEnabled(landmark_selected && isActionEnabled("more_info"));
+ mShowOnMapBtn->setEnabled(true);
// TODO: mantipov: Uncomment when mShareBtn is supported
// Share button should be enabled when neither a folder nor a landmark is selected
@@ -434,9 +466,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;
@@ -446,7 +478,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;
@@ -534,7 +566,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()
@@ -556,7 +588,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".
@@ -570,6 +602,7 @@ 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));
@@ -588,7 +621,7 @@ void LLLandmarksPanel::initLandmarksPanel(LLPlacesInventoryPanel* inventory_list
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);
@@ -596,6 +629,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)
@@ -619,7 +653,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
@@ -656,14 +690,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
));
@@ -676,6 +708,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));
}
@@ -713,11 +747,6 @@ void LLLandmarksPanel::onActionsButtonClick()
showActionMenu(menu,OPTIONS_BUTTON_NAME);
}
-void LLLandmarksPanel::onAddButtonHeldDown()
-{
- showActionMenu(mMenuAdd,ADD_BUTTON_NAME);
-}
-
void LLLandmarksPanel::showActionMenu(LLMenuGL* menu, std::string spawning_view_name)
{
if (menu)
@@ -777,6 +806,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);
+ }
+ }
}
}
@@ -917,12 +957,7 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
return false;
}
}
- else if (!root_folder_view)
- {
- return false;
- }
else if ( "paste" == command_name
- || "rename" == command_name
|| "cut" == command_name
|| "copy" == command_name
|| "delete" == command_name
@@ -934,16 +969,16 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
}
else if ( "teleport" == command_name
|| "more_info" == command_name
- || "rename" == command_name
|| "show_on_map" == command_name
|| "copy_slurl" == command_name
)
{
// disable some commands for multi-selection. EXT-1757
- if (root_folder_view->getSelectedCount() > 1)
- {
- return false;
- }
+ return root_folder_view && root_folder_view->getSelectedCount() == 1;
+ }
+ else if ("rename" == command_name)
+ {
+ return root_folder_view && root_folder_view->getSelectedCount() == 1 && canSelectedBeModified(command_name);
}
else if("category" == command_name)
{
@@ -953,14 +988,18 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
// ... but except Received folder
return !isReceivedFolderSelected();
}
- else return false;
+ //"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;
}
@@ -974,13 +1013,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)
{
@@ -1071,7 +1107,7 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co
}
else if ("delete" == command_name)
{
- can_be_modified = listenerp ? listenerp->isItemRemovable() : false;
+ can_be_modified = listenerp ? listenerp->isItemRemovable() && !listenerp->isItemInTrash() : false;
}
else if("paste" == command_name)
{
@@ -1097,7 +1133,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;
@@ -1113,7 +1149,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;
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index f1ce1a18b5..8f8d9c2708 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();
@@ -112,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);
@@ -121,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;
@@ -142,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.
@@ -170,6 +171,8 @@ private:
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 7bd03167fd..0009f7203a 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,10 +211,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
}
#if !USE_VIEWER_AUTH
- childSetPrevalidate("first_name_edit", LLTextValidate::validateASCIIPrintableNoSpace);
- childSetPrevalidate("last_name_edit", LLTextValidate::validateASCIIPrintableNoSpace);
-
- 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
@@ -226,29 +221,17 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
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"));
- sim_string = LLURLSimString::sInstance.mSimString;
- }
-
- 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);
@@ -287,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);
}
@@ -378,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()
{
@@ -455,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();
@@ -499,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.
@@ -515,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)
@@ -532,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
@@ -560,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
@@ -650,61 +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
+ if (!sInstance)
+ {
+ return;
+ }
+
+ LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
+
+ switch(LLStartUp::getStartSLURL().getType())
+ {
+ 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 )
- {
- // Don't show on first run after install
- // Otherwise ShowStartLocation defaults to true.
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);
@@ -863,7 +892,7 @@ void LLPanelLogin::loadLoginPage()
#endif
LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
-
+
// navigate to the "real" page
if (gSavedSettings.getBOOL("RegInClient"))
{
@@ -912,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())
+ {
+ LLNotificationsUtil::add("StartRegionEmpty");
+ return;
+ }
+ try
{
- // *NOTE: Mani - Location field is not always committed by this point!
- LLURLSimString::sInstance.setString(combo_text);
- has_location = true;
+ 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");
}
}
}
@@ -1002,61 +1058,97 @@ 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)
@@ -1069,3 +1161,14 @@ void LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe)
onSelectServer(combo, NULL);
}
}
+
+void LLPanelLogin::updateLoginPanelLinks()
+{
+ LLSD grid_data = LLGridManager::getInstance()->getGridInfo();
+ 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 421c9df9a1..54d1b46016 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,6 +117,7 @@ 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
@@ -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,7 +422,7 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
return;
}
- gInventory.startBackgroundFetch();
+ LLInventoryModelBackgroundFetch::instance().start();
mFilterSubString = search_string;
if (mActivePanel->getFilterSubString().empty() && mFilterSubString.empty())
@@ -488,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();
@@ -498,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();
}
@@ -538,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();
}
@@ -550,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()
@@ -571,7 +607,7 @@ void LLPanelMainInventory::toggleFindOptions()
if (parent_floater) // Seraph: Fix this, shouldn't be null even for sidepanel
parent_floater->addDependentFloater(mFinderHandle);
// start background fetch of folders
- gInventory.startBackgroundFetch();
+ LLInventoryModelBackgroundFetch::instance().start();
}
else
{
@@ -864,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
@@ -887,7 +921,7 @@ void LLPanelMainInventory::updateListCommands()
{
bool trash_enabled = isActionEnabled("delete");
- mListCommands->childSetEnabled("trash_btn", trash_enabled);
+ mTrashButton->setEnabled(trash_enabled);
}
void LLPanelMainInventory::onGearButtonClick()
@@ -1014,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")
@@ -1059,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;
@@ -1154,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..5a068373f5 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"
@@ -113,7 +114,8 @@ protected:
void setSortBy(const LLSD& userdata);
void saveTexture(const LLSD& userdata);
bool isSaveTextureEnabled(const LLSD& userdata);
-
+ void updateItemcountText();
+
private:
LLFloaterInventoryFinder* getFinder();
@@ -144,7 +146,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 3504cbd1ef..3f620869e0 100644
--- a/indra/newview/llpanelme.cpp
+++ b/indra/newview/llpanelme.cpp
@@ -36,6 +36,7 @@
#include "llavatarconstants.h"
#include "llpanelme.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llagentwearables.h"
#include "lliconctrl.h"
#include "llsidetray.h"
@@ -62,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;
}
@@ -140,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
index 4f2d6374ca..6411cd802d 100644
--- a/indra/newview/llpanelnearbymedia.cpp
+++ b/indra/newview/llpanelnearbymedia.cpp
@@ -74,6 +74,7 @@ static const LLUUID PARCEL_AUDIO_LIST_ITEM_UUID = LLUUID("DF4B020D-8A24-4B95-AB5
// LLPanelNearByMedia
//
+
LLPanelNearByMedia::LLPanelNearByMedia()
: mMediaList(NULL),
mEnableAllCtrl(NULL),
@@ -87,6 +88,8 @@ LLPanelNearByMedia::LLPanelNearByMedia()
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));
@@ -168,12 +171,19 @@ BOOL LLPanelNearByMedia::postBuild()
mLessRect = getRect();
mLessRect.mBottom = minimized_controls->getRect().mBottom;
- getChild<LLUICtrl>("more_less_btn")->setValue(false);
+ 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)
{
@@ -954,7 +964,7 @@ void LLPanelNearByMedia::onAdvancedButtonClick()
void LLPanelNearByMedia::onMoreLess()
{
- bool is_more = getChild<LLUICtrl>("more_less_btn")->getValue();
+ bool is_more = getChild<LLUICtrl>("more_btn")->getVisible();
mNearbyMediaPanel->setVisible(is_more);
// enable resizing when expanded
@@ -964,6 +974,9 @@ void LLPanelNearByMedia::onMoreLess()
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()
@@ -997,7 +1010,7 @@ void LLPanelNearByMedia::updateControls()
if (NULL == impl)
{
// Just means it hasn't started yet
- showBasicControls(false, false, false);
+ showBasicControls(false, false, false, false, 0);
}
else if (impl->isMediaTimeBased())
{
@@ -1009,7 +1022,11 @@ void LLPanelNearByMedia::updateControls()
}
else {
// non-time-based parcel media
- showBasicControls(LLViewerMedia::isParcelMediaPlaying(), false, false);
+ showBasicControls(LLViewerMedia::isParcelMediaPlaying(),
+ false,
+ false,
+ impl->getVolume() == 0.0,
+ impl->getVolume());
}
}
}
@@ -1032,19 +1049,23 @@ void LLPanelNearByMedia::updateControls()
else {
showBasicControls(!impl->isMediaDisabled(),
! impl->isParcelMedia(), // include_zoom
- LLViewerMediaFocus::getInstance()->isZoomed());
+ LLViewerMediaFocus::getInstance()->isZoomed(),
+ impl->getVolume() == 0.0,
+ impl->getVolume());
}
}
}
}
-void LLPanelNearByMedia::showBasicControls(bool playing, bool include_zoom, bool is_zoomed)
+void LLPanelNearByMedia::showBasicControls(bool playing, bool include_zoom, bool is_zoomed, bool muted, F32 volume)
{
mStopCtrl->setVisible(playing);
mPlayCtrl->setVisible(!playing);
mPauseCtrl->setVisible(false);
- mMuteCtrl->setVisible(false);
- mVolumeSliderCtrl->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);
@@ -1143,7 +1164,7 @@ void LLPanelNearByMedia::onClickSelectedMediaMute()
else {
LLViewerMediaImpl* impl = (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) ?
((LLViewerMediaImpl*)LLViewerParcelMedia::getParcelMedia()) : LLViewerMedia::getMediaImplFromTextureID(selected_media_id);
- if (NULL != impl && impl->isMediaTimeBased())
+ if (NULL != impl)
{
F32 volume = impl->getVolume();
if(volume > 0.0)
@@ -1174,7 +1195,7 @@ void LLPanelNearByMedia::onCommitSelectedMediaVolume()
else {
LLViewerMediaImpl* impl = (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) ?
((LLViewerMediaImpl*)LLViewerParcelMedia::getParcelMedia()) : LLViewerMedia::getMediaImplFromTextureID(selected_media_id);
- if (NULL != impl && impl->isMediaTimeBased())
+ if (NULL != impl)
{
impl->setVolume(mVolumeSlider->getValueF32());
}
diff --git a/indra/newview/llpanelnearbymedia.h b/indra/newview/llpanelnearbymedia.h
index af4659365f..3cecf8e40c 100644
--- a/indra/newview/llpanelnearbymedia.h
+++ b/indra/newview/llpanelnearbymedia.h
@@ -63,6 +63,10 @@ public:
// 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();
@@ -136,7 +140,7 @@ private:
bool shouldShow(LLViewerMediaImpl* impl);
- void showBasicControls(bool playing, bool include_zoom, bool is_zoomed);
+ 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();
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index dedd1afcde..0d3beaa9a5 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; }
@@ -128,7 +131,7 @@ 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; }
@@ -147,9 +150,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,11 +174,7 @@ LLInventoryItem* LLTaskInvFVBridge::findItem() const
void LLTaskInvFVBridge::showProperties()
{
- LLSD key;
- key["object"] = mPanel->getTaskUUID();
- key["id"] = mUUID;
- LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
-
+ show_item_profile(mUUID);
// Disable old properties floater; this is replaced by the sidepanel.
/*
@@ -343,13 +349,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, FALSE, 0, item_is_multi );
}
void LLTaskInvFVBridge::openItem()
@@ -369,8 +371,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 +596,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 +610,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
{
@@ -863,33 +866,14 @@ 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 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 +892,17 @@ 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 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 +922,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 +932,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)
@@ -1034,28 +1004,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 +1017,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,36 +1044,21 @@ 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 void openItem();
virtual BOOL removeItem();
@@ -1142,14 +1067,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 +1102,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 +1116,15 @@ 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 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 +1155,15 @@ 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 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 +1188,15 @@ 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 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 +1225,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, FALSE, mFlags, FALSE );
}
@@ -1408,16 +1248,15 @@ LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory*
LLInventoryObject* object)
{
LLTaskInvFVBridge* new_bridge = NULL;
+ const LLInventoryItem* item = dynamic_cast<LLInventoryItem*>(object);
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->getName());
break;
case LLAssetType::AT_SOUND:
new_bridge = new LLTaskSoundBridge(panel,
@@ -1442,9 +1281,13 @@ LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory*
// object->getName());
break;
case LLAssetType::AT_OBJECT:
- new_bridge = new LLTaskObjectBridge(panel,
- object->getUUID(),
- object->getName());
+ {
+ U32 flags = ( NULL == item ? 0 : item->getFlags() );
+ new_bridge = new LLTaskObjectBridge(panel,
+ object->getUUID(),
+ object->getName(),
+ flags);
+ }
break;
case LLAssetType::AT_NOTECARD:
new_bridge = new LLTaskNotecardBridge(panel,
@@ -1463,11 +1306,9 @@ LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory*
break;
case LLAssetType::AT_CLOTHING:
case LLAssetType::AT_BODYPART:
- item = (LLInventoryItem*)object;
new_bridge = new LLTaskWearableBridge(panel,
object->getUUID(),
object->getName(),
- type,
item->getFlags());
break;
case LLAssetType::AT_CATEGORY:
@@ -1480,8 +1321,6 @@ LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory*
object->getUUID(),
object->getName());
break;
-
- break;
default:
llinfos << "Unhandled inventory type (llassetstorage.h): "
<< (S32)type << llendl;
@@ -1517,6 +1356,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
@@ -1575,9 +1415,10 @@ void LLPanelObjectInventory::reset()
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);
@@ -1604,7 +1445,7 @@ void LLPanelObjectInventory::reset()
}
void LLPanelObjectInventory::inventoryChanged(LLViewerObject* object,
- InventoryObjectList* inventory,
+ LLInventoryObject::object_list_t* inventory,
S32 serial_num,
void* data)
{
@@ -1621,7 +1462,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++;
@@ -1644,7 +1485,7 @@ void LLPanelObjectInventory::updateInventory()
BOOL inventory_has_focus = FALSE;
if (mHaveInventory)
{
- mFolders->getSelectionList(selected_items);
+ selected_items = mFolders->getSelectionList();
inventory_has_focus = gFocusMgr.childHasKeyboardFocus(mFolders);
}
@@ -1654,7 +1495,7 @@ void LLPanelObjectInventory::updateInventory()
if (objectp)
{
LLInventoryObject* inventory_root = objectp->getInventoryRoot();
- InventoryObjectList contents;
+ LLInventoryObject::object_list_t contents;
objectp->getInventoryContents(contents);
if (inventory_root)
{
@@ -1708,7 +1549,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)
{
@@ -1737,7 +1578,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)
{
@@ -1746,8 +1587,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..ae4b288588
--- /dev/null
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -0,0 +1,725 @@
+/**
+ * @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 "llagentwearables.h"
+#include "llappearancemgr.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 "llpaneloutfitsinventory.h"
+#include "lluiconstants.h"
+#include "llscrolllistctrl.h"
+#include "lltextbox.h"
+#include "lluictrlfactory.h"
+#include "llsdutil.h"
+#include "llsidepanelappearance.h"
+#include "lltoggleablemenu.h"
+#include "llwearablelist.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 SAVE_BTN("save_btn");
+static const std::string REVERT_BTN("revert_btn");
+
+class LLCOFObserver : public LLInventoryObserver
+{
+public:
+ LLCOFObserver(LLPanelOutfitEdit *panel) : mPanel(panel),
+ mCOFLastVersion(LLViewerInventoryCategory::VERSION_UNKNOWN)
+ {
+ gInventory.addObserver(this);
+ }
+
+ virtual ~LLCOFObserver()
+ {
+ if (gInventory.containsObserver(this))
+ {
+ gInventory.removeObserver(this);
+ }
+ }
+
+ virtual void changed(U32 mask)
+ {
+ if (!gInventory.isInventoryUsable()) return;
+
+ bool panel_updated = checkCOF();
+
+ if (!panel_updated)
+ {
+ checkBaseOutfit();
+ }
+ }
+
+protected:
+
+ /** Get a version of an inventory category specified by its UUID */
+ static S32 getCategoryVersion(const LLUUID& cat_id)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
+ if (!cat) return LLViewerInventoryCategory::VERSION_UNKNOWN;
+
+ return cat->getVersion();
+ }
+
+ bool 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;
+
+ mPanel->update();
+
+ return true;
+ }
+
+ void checkBaseOutfit()
+ {
+ LLUUID baseoutfit_id = LLAppearanceMgr::getInstance()->getBaseOutfitUUID();
+
+ if (baseoutfit_id == mBaseOutfitId)
+ {
+ if (baseoutfit_id.isNull()) return;
+
+ const S32 baseoutfit_ver = getCategoryVersion(baseoutfit_id);
+
+ if (baseoutfit_ver == mBaseOutfitLastVersion) return;
+ }
+ else
+ {
+ mBaseOutfitId = baseoutfit_id;
+ mPanel->updateCurrentOutfitName();
+
+ if (baseoutfit_id.isNull()) return;
+
+ mBaseOutfitLastVersion = getCategoryVersion(mBaseOutfitId);
+ }
+
+ mPanel->updateVerbs();
+ }
+
+
+
+
+ LLPanelOutfitEdit *mPanel;
+
+ //last version number of a COF category
+ S32 mCOFLastVersion;
+
+ LLUUID mBaseOutfitId;
+
+ S32 mBaseOutfitLastVersion;
+};
+
+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),
+ mCOFObserver(NULL),
+ mGearMenu(NULL),
+ mCOFDragAndDropObserver(NULL),
+ mInitialized(false)
+{
+ mSavedFolderState = new LLSaveFolderState();
+ mSavedFolderState->setApply(FALSE);
+
+ mCOFObserver = new LLCOFObserver(this);
+
+ mLookItemTypes.reserve(NUM_LOOK_ITEM_TYPES);
+ for (U32 i = 0; i < NUM_LOOK_ITEM_TYPES; i++)
+ {
+ mLookItemTypes.push_back(LLLookItemType());
+ }
+
+
+}
+
+LLPanelOutfitEdit::~LLPanelOutfitEdit()
+{
+ delete mSavedFolderState;
+
+ delete mCOFObserver;
+ delete mCOFDragAndDropObserver;
+}
+
+BOOL LLPanelOutfitEdit::postBuild()
+{
+ // gInventory.isInventoryUsable() no longer needs to be tested per Richard's fix for race conditions between inventory and panels
+
+ mLookItemTypes[LIT_ALL] = LLLookItemType(getString("Filter.All"), ALL_ITEMS_MASK);
+ mLookItemTypes[LIT_WEARABLE] = LLLookItemType(getString("Filter.Clothes/Body"), WEARABLE_MASK);
+ mLookItemTypes[LIT_ATTACHMENT] = LLLookItemType(getString("Filter.Objects"), ATTACHMENT_MASK);
+
+ 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::showFilteredFolderWearablesPanel, this), NULL);
+ childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::showFilteredWearablesPanel, this), NULL);
+ childSetCommitCallback("gear_menu_btn", boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1), NULL);
+ childSetCommitCallback("wearables_gear_menu_btn", boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1), NULL);
+
+ mCOFWearables = getChild<LLCOFWearables>("cof_wearables_list");
+ mCOFWearables->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onOutfitItemSelectionChange, 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);
+
+ mCOFWearables->childSetAction("add_btn", boost::bind(&LLPanelOutfitEdit::toggleAddWearablesPanel, this));
+
+
+ mInventoryItemsPanel = getChild<LLInventoryPanel>("inventory_items");
+ 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());
+
+ LLComboBox* type_filter = getChild<LLComboBox>("filter_wearables_combobox");
+ type_filter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onTypeFilterChanged, this, _1));
+ type_filter->removeall();
+ for (U32 i = 0; i < mLookItemTypes.size(); ++i)
+ {
+ type_filter->add(mLookItemTypes[i].displayName);
+ }
+ type_filter->setCurrentByIndex(LIT_ALL);
+
+ mSearchFilter = getChild<LLFilterEditor>("look_item_filter");
+ mSearchFilter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onSearchEdit, this, _2));
+
+ 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()));
+
+ childSetAction(SAVE_BTN, boost::bind(&LLPanelOutfitEdit::saveOutfit, this, false));
+ childSetAction("save_flyout_btn", boost::bind(&LLPanelOutfitEdit::showSaveMenu, this));
+
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar save_registar;
+ save_registar.add("Outfit.Save.Action", boost::bind(&LLPanelOutfitEdit::saveOutfit, this, false));
+ save_registar.add("Outfit.SaveAsNew.Action", boost::bind(&LLPanelOutfitEdit::saveOutfit, this, true));
+ mSaveMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_save_outfit.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+
+ mWearableItemsPanel = getChild<LLPanel>("filtered_wearables_panel");
+ mWearableItemsList = getChild<LLInventoryItemsList>("filtered_wearables_list");
+ mWearableListManager = new LLFilteredWearableListManager(mWearableItemsList, ALL_ITEMS_MASK);
+
+ return TRUE;
+}
+
+// virtual
+void LLPanelOutfitEdit::onOpen(const LLSD& key)
+{
+ if (!mInitialized)
+ {
+ 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()
+{
+ childSetVisible("add_wearables_panel", !childIsVisible("add_wearables_panel"));
+}
+
+void LLPanelOutfitEdit::showWearablesFilter()
+{
+ bool filter_visible = childGetValue("filter_button");
+
+ childSetVisible("filter_panel", filter_visible);
+
+ if(!filter_visible)
+ {
+ mSearchFilter->clear();
+ onSearchEdit(LLStringUtil::null);
+ }
+}
+
+void LLPanelOutfitEdit::showFilteredWearablesPanel()
+{
+ if(switchPanels(mInventoryItemsPanel, mWearableItemsPanel))
+ {
+ mFolderViewBtn->setToggleState(FALSE);
+ mFolderViewBtn->setImageOverlay(getString("folder_view_off"), mFolderViewBtn->getImageOverlayHAlign());
+ mListViewBtn->setImageOverlay(getString("list_view_on"), mListViewBtn->getImageOverlayHAlign());
+ }
+ mListViewBtn->setToggleState(TRUE);
+}
+
+void LLPanelOutfitEdit::showFilteredFolderWearablesPanel()
+{
+ if(switchPanels(mWearableItemsPanel, mInventoryItemsPanel))
+ {
+ mListViewBtn->setToggleState(FALSE);
+ mListViewBtn->setImageOverlay(getString("list_view_off"), mListViewBtn->getImageOverlayHAlign());
+ mFolderViewBtn->setImageOverlay(getString("folder_view_on"), mFolderViewBtn->getImageOverlayHAlign());
+ }
+ mFolderViewBtn->setToggleState(TRUE);
+}
+
+void LLPanelOutfitEdit::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 LLPanelOutfitEdit::showSaveMenu()
+{
+ S32 x, y;
+ LLUI::getMousePositionLocal(this, &x, &y);
+
+ mSaveMenu->updateParent(LLMenuGL::sMenuContainer);
+ LLMenuGL::showPopup(this, mSaveMenu, x, y);
+}
+
+void LLPanelOutfitEdit::onTypeFilterChanged(LLUICtrl* ctrl)
+{
+ LLComboBox* type_filter = dynamic_cast<LLComboBox*>(ctrl);
+ llassert(type_filter);
+ if (type_filter)
+ {
+ U32 curr_filter_type = type_filter->getCurrentIndex();
+ mInventoryItemsPanel->setFilterTypes(mLookItemTypes[curr_filter_type].inventoryMask);
+ mWearableListManager->setFilterMask(mLookItemTypes[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::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 (mWearableItemsPanel->getVisible())
+ {
+ selected_id = mWearableItemsList->getSelectedUUID();
+ }
+
+ if (selected_id.isNull()) return;
+
+ LLAppearanceMgr::getInstance()->wearItemOnAvatar(selected_id);
+}
+
+
+void LLPanelOutfitEdit::onRemoveFromOutfitClicked(void)
+{
+ LLUUID id_to_remove = mCOFWearables->getSelectedUUID();
+
+ LLAppearanceMgr::getInstance()->removeItemFromAvatar(id_to_remove);
+}
+
+
+void LLPanelOutfitEdit::onEditWearableClicked(void)
+{
+ LLUUID id_to_edit = mCOFWearables->getSelectedUUID();
+ LLViewerInventoryItem * item_to_edit = gInventory.getItem(id_to_edit);
+
+ if (item_to_edit)
+ {
+ // returns null if not a wearable (attachment, etc).
+ LLWearable* wearable_to_edit = gAgentWearables.getWearableFromAssetID(item_to_edit->getAssetUUID());
+ if(wearable_to_edit)
+ {
+ bool can_modify = false;
+ bool is_complete = item_to_edit->isFinished();
+ // if item_to_edit is a link, its properties are not appropriate,
+ // lets get original item with actual properties
+ LLViewerInventoryItem* original_item = gInventory.getItem(wearable_to_edit->getItemID());
+ if(original_item)
+ {
+ can_modify = original_item->getPermissions().allowModifyBy(gAgentID);
+ is_complete = original_item->isFinished();
+ }
+
+ if (can_modify && is_complete)
+ {
+ LLSidepanelAppearance::editWearable(wearable_to_edit, getParent());
+ if (mEditWearableBtn->getVisible())
+ {
+ mEditWearableBtn->setVisible(FALSE);
+ }
+ }
+ }
+ }
+}
+
+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::onOutfitItemSelectionChange(void)
+{
+ LLUUID item_id = mCOFWearables->getSelectedUUID();
+
+ //*TODO show Edit Wearable Button
+
+ LLViewerInventoryItem* item_to_remove = gInventory.getItem(item_id);
+ if (!item_to_remove) return;
+
+ switch (item_to_remove->getType())
+ {
+ case LLAssetType::AT_CLOTHING:
+ case LLAssetType::AT_OBJECT:
+ default:
+ break;
+ }
+}
+
+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()
+{
+ //*TODO implement better handling of COF dirtiness
+ LLAppearanceMgr::getInstance()->updateIsDirty();
+
+ bool outfit_is_dirty = LLAppearanceMgr::getInstance()->isOutfitDirty();
+ bool has_baseoutfit = LLAppearanceMgr::getInstance()->getBaseOutfitUUID().notNull();
+
+ childSetEnabled(SAVE_BTN, outfit_is_dirty);
+ childSetEnabled(REVERT_BTN, outfit_is_dirty && has_baseoutfit);
+
+ mSaveMenu->setItemEnabled("save_outfit", outfit_is_dirty);
+
+ mStatus->setText(outfit_is_dirty ? getString("unsaved_changes") : getString("now_editing"));
+
+}
+
+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)
+ {
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+
+ registrar.add("Gear.OnClick", boost::bind(&LLPanelOutfitEdit::onGearMenuItemClick, this, _2));
+
+ mGearMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(
+ "menu_cof_gear.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
+ mGearMenu->buildDrawLabels();
+ mGearMenu->updateParent(LLMenuGL::sMenuContainer);
+ }
+
+ S32 menu_y = mGearMenu->getRect().getHeight() + clicked_button->getRect().getHeight();
+ LLMenuGL::showPopup(clicked_button, mGearMenu, 0, menu_y);
+}
+
+void LLPanelOutfitEdit::onGearMenuItemClick(const LLSD& data)
+{
+ std::string param = data.asString();
+ if("add" == param)
+ {
+ // TODO
+ }
+}
+
+// EOF
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
new file mode 100644
index 0000000000..1bf69c5606
--- /dev/null
+++ b/indra/newview/llpaneloutfitedit.h
@@ -0,0 +1,159 @@
+/**
+ * @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 "llinventoryitemslist.h"
+#include "llinventorymodel.h"
+
+class LLButton;
+class LLCOFWearables;
+class LLTextBox;
+class LLInventoryCategory;
+class LLCOFObserver;
+class LLCOFDragAndDropObserver;
+class LLInventoryPanel;
+class LLSaveFolderState;
+class LLFolderViewItem;
+class LLScrollListCtrl;
+class LLToggleableMenu;
+class LLFilterEditor;
+class LLFilteredWearableListManager;
+class LLMenuGL;
+
+class LLPanelOutfitEdit : public LLPanel
+{
+ LOG_CLASS(LLPanelOutfitEdit);
+public:
+
+ // NOTE: initialize mLookItemTypes at the index of any new enum you add in the LLPanelOutfitEdit() constructor
+ typedef enum e_look_item_type
+ {
+ LIT_ALL = 0,
+ LIT_WEARABLE, // clothing or shape
+ LIT_ATTACHMENT,
+ NUM_LOOK_ITEM_TYPES
+ } ELookItemType;
+
+ struct LLLookItemType {
+ std::string displayName;
+ U64 inventoryMask;
+ LLLookItemType() : displayName("NONE"), inventoryMask(0) {}
+ LLLookItemType(std::string name, U64 mask) : displayName(name), inventoryMask(mask) {}
+ };
+
+ LLPanelOutfitEdit();
+ /*virtual*/ ~LLPanelOutfitEdit();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ void moveWearable(bool closer_to_body);
+
+ void toggleAddWearablesPanel();
+ void showWearablesFilter();
+ void showFilteredWearablesPanel();
+ void showFilteredFolderWearablesPanel();
+ void saveOutfit(bool as_new = false);
+ void showSaveMenu();
+
+ void onTypeFilterChanged(LLUICtrl* ctrl);
+ void onSearchEdit(const std::string& string);
+ void onInventorySelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+ void onAddToOutfitClicked(void);
+ void onOutfitItemSelectionChange(void);
+ void onRemoveFromOutfitClicked(void);
+ void onEditWearableClicked(void);
+
+ 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 onGearMenuItemClick(const LLSD& data);
+
+
+ LLTextBox* mCurrentOutfitName;
+ LLTextBox* mStatus;
+ LLInventoryPanel* mInventoryItemsPanel;
+ LLFilterEditor* mSearchFilter;
+ LLSaveFolderState* mSavedFolderState;
+ std::string mSearchString;
+ LLButton* mEditWearableBtn;
+ LLButton* mFolderViewBtn;
+ LLButton* mListViewBtn;
+ LLToggleableMenu* mSaveMenu;
+
+ LLFilteredWearableListManager* mWearableListManager;
+ LLInventoryItemsList* mWearableItemsList;
+ LLPanel* mWearableItemsPanel;
+
+ LLCOFObserver* mCOFObserver;
+ LLCOFDragAndDropObserver* mCOFDragAndDropObserver;
+
+ std::vector<LLLookItemType> mLookItemTypes;
+
+ LLCOFWearables* mCOFWearables;
+ LLMenuGL* mGearMenu;
+ bool mInitialized;
+};
+
+#endif // LL_LLPANELOUTFITEDIT_H
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index c2f2d32142..a7e8f497d9 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -43,10 +43,13 @@
#include "llfloaterinventory.h"
#include "llfoldervieweventlistener.h"
#include "llinventoryfunctions.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llinventorypanel.h"
#include "lllandmark.h"
#include "lllineeditor.h"
#include "llmodaldialog.h"
+#include "llnotificationsutil.h"
+#include "lloutfitslist.h"
#include "llsidepanelappearance.h"
#include "llsidetray.h"
#include "lltabcontainer.h"
@@ -65,77 +68,17 @@ 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
-{
-private:
- std::string mItemName;
- std::string mTempItemName;
-
- boost::signals2::signal<void (const std::string&)> mSaveAsSignal;
-
-public:
- LLOutfitSaveAsDialog( const LLSD& key )
- : LLModalDialog( key ),
- mTempItemName(key.asString())
- {
- }
-
- BOOL postBuild()
- {
- 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;
- }
-
- void setSaveAsCommit( const boost::signals2::signal<void (const std::string&)>::slot_type& cb )
- {
- mSaveAsSignal.connect(cb);
- }
- virtual void onOpen(const LLSD& key)
- {
- LLLineEditor* edit = getChild<LLLineEditor>("name ed");
- if (edit)
- {
- edit->setFocus(TRUE);
- edit->selectAll();
- }
- }
-
- void onSave()
- {
- mItemName = childGetValue("name ed").asString();
- LLStringUtil::trim(mItemName);
- if( !mItemName.empty() )
- {
- mSaveAsSignal(mItemName);
- closeFloater(); // destroys this object
- }
- }
-
- void onCancel()
- {
- closeFloater(); // destroys this object
- }
-};
-
LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
- mActivePanel(NULL),
- mParent(NULL)
+ mMyOutfitsPanel(NULL),
+ mCurrentOutfitPanel(NULL),
+ mParent(NULL),
+ mInitialized(false)
{
mSavedFolderState = new LLSaveFolderState();
mSavedFolderState->setApply(FALSE);
-
- 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;
- }
+ gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoaded, this));
}
LLPanelOutfitsInventory::~LLPanelOutfitsInventory()
@@ -146,16 +89,36 @@ LLPanelOutfitsInventory::~LLPanelOutfitsInventory()
// 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);
+ }
+
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,14 +147,8 @@ void LLPanelOutfitsInventory::onOpen(const LLSD& key)
void LLPanelOutfitsInventory::updateVerbs()
{
- if (mParent)
- {
- mParent->updateVerbs();
- }
-
if (mListCommands)
{
- mListCommands->childSetVisible("look_edit_btn",sShowDebugEditor);
updateListCommands();
}
}
@@ -205,9 +162,17 @@ void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent)
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 +182,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 +198,43 @@ 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())
{
- listenerp->performAction(NULL, NULL,"replaceoutfit");
+ mMyOutfitsPanel->performAction("replaceoutfit");
+ setWearablesLoading(true);
+ }
+ else
+ {
+ 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())
{
- listenerp->performAction(NULL, NULL,"addtooutfit");
+ mMyOutfitsPanel->performAction("addtooutfit");
+ }
+ else
+ {
+ LLFolderViewEventListener* listenerp = getCorrectListenerForAction();
+ if (listenerp)
+ {
+ listenerp->performAction(NULL, "addtooutfit");
+ }
}
}
@@ -259,7 +243,7 @@ void LLPanelOutfitsInventory::onRemove()
LLFolderViewEventListener* listenerp = getCorrectListenerForAction();
if (listenerp)
{
- listenerp->performAction(NULL, NULL,"removefromoutfit");
+ listenerp->performAction(NULL, "removefromoutfit");
}
}
@@ -267,37 +251,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 +322,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 +355,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"));
}
//////////////////////////////////////////////////////////////////////////////////
@@ -364,8 +376,6 @@ void LLPanelOutfitsInventory::initListCommandsHandlers()
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,11 +383,8 @@ 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());
+ mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_outfit_gear.xml",
+ gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
}
void LLPanelOutfitsInventory::updateListCommands()
@@ -425,7 +432,11 @@ void LLPanelOutfitsInventory::onTrashButtonClick()
void LLPanelOutfitsInventory::onClipboardAction(const LLSD& userdata)
{
std::string command_name = userdata.asString();
- getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
+ // TODO: add handling "My Outfits" tab.
+ if (isCOFPanelActive())
+ {
+ getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
+ }
updateListCommands();
updateVerbs();
}
@@ -479,32 +490,35 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
if (command_name == "delete" || command_name == "remove")
{
BOOL can_delete = FALSE;
- LLFolderView *folder = getActivePanel()->getRootFolder();
- if (folder)
+
+ // TODO: add handling "My Outfits" tab.
+ 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 can_delete;
}
return FALSE;
}
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();
@@ -549,12 +563,16 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
bool LLPanelOutfitsInventory::hasItemsSelected()
{
bool has_items_selected = false;
- LLFolderView *folder = getActivePanel()->getRootFolder();
- if (folder)
+
+ // TODO: add handling "My Outfits" tab.
+ if (isCOFPanelActive())
{
- std::set<LLUUID> selection_set;
- folder->getSelectionList(selection_set);
- has_items_selected = (selection_set.size() > 0);
+ LLFolderView* root = getActivePanel()->getRootFolder();
+ if (root)
+ {
+ std::set<LLUUID> selection_set = root->getSelectionList();
+ has_items_selected = (selection_set.size() > 0);
+ }
}
return has_items_selected;
}
@@ -581,74 +599,82 @@ 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);
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);
}
- mActivePanel->setFilterSubString(mFilterSubString);
+ else
+ {
+ mMyOutfitsPanel->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);
+
+ llassert(mParent);
+ if (mParent)
+ {
+ mParent->setWearablesLoading(val);
+ }
+}
+
+void LLPanelOutfitsInventory::onWearablesLoaded()
+{
+ setWearablesLoading(false);
+}
+
+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..a0fe91cd80 100644
--- a/indra/newview/llpaneloutfitsinventory.h
+++ b/indra/newview/llpaneloutfitsinventory.h
@@ -40,6 +40,7 @@ class LLFolderView;
class LLFolderViewItem;
class LLFolderViewEventListener;
class LLInventoryPanel;
+class LLOutfitsList;
class LLSaveFolderState;
class LLButton;
class LLMenuGL;
@@ -48,6 +49,7 @@ class LLTabContainer;
class LLPanelOutfitsInventory : public LLPanel
{
+ LOG_CLASS(LLPanelOutfitsInventory);
public:
LLPanelOutfitsInventory();
virtual ~LLPanelOutfitsInventory();
@@ -61,10 +63,9 @@ 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.
@@ -72,6 +73,9 @@ public:
void setParent(LLSidepanelAppearance *parent);
LLFolderView* getRootFolder();
+ LLSidepanelAppearance* getAppearanceSP();
+
+ static LLPanelOutfitsInventory* findInstance();
protected:
void updateVerbs();
@@ -86,20 +90,21 @@ private:
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 //
////////////////////////////////////////////////////////////////////////////////
@@ -120,6 +125,8 @@ protected:
void onCustomAction(const LLSD& command_name);
bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
bool hasItemsSelected();
+ void setWearablesLoading(bool val);
+ void onWearablesLoaded();
private:
LLPanel* mListCommands;
LLMenuGL* mMenuGearDefault;
@@ -127,8 +134,8 @@ private:
// 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 03e8ab644e..0a4af00f78 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -134,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();
@@ -178,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
@@ -443,6 +443,7 @@ public:
LLPanelPeople::LLPanelPeople()
: LLPanel(),
mFilterSubString(LLStringUtil::null),
+ mFilterSubStringOrig(LLStringUtil::null),
mFilterEditor(NULL),
mTabContainer(NULL),
mOnlineFriendList(NULL),
@@ -512,15 +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->setNoGroupsMsg(getString("no_groups_msg"));
- mGroupList->setNoFilteredGroupsMsg(getString("no_filtered_groups_msg"));
+ mGroupList->setNoItemsMsg(getString("no_groups_msg"));
+ mGroupList->setNoFilteredItemsMsg(getString("no_filtered_groups_msg"));
mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
mRecentList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
@@ -619,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();
@@ -641,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)
@@ -652,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();
@@ -672,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)
{
@@ -708,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()
@@ -743,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();
}
@@ -756,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);
@@ -806,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);
@@ -852,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();
@@ -965,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;
@@ -983,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);
@@ -1063,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 )
@@ -1094,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)
@@ -1121,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 )
{
@@ -1143,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]);
@@ -1293,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)
@@ -1429,6 +1449,9 @@ void LLPanelPeople::showFriendsAccordionsIfNeeded()
// Rearrange accordions
LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");
accordion->arrange();
+
+ // keep help text in a synchronization with accordions visibility.
+ updateFriendListHelpText();
}
}
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 854651cd01..dc1c422ff0 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -42,6 +42,7 @@
#include "llagent.h"
#include "llagentdata.h" // for gAgentID
#include "llavataractions.h"
+#include "llcallingcard.h" // for LLAvatarTracker
#include "llviewermenu.h" // for gMenuHolder
namespace LLPanelPeopleMenus
@@ -49,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()
@@ -135,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
{
@@ -151,9 +93,7 @@ LLContextMenu* NearbyMenu::createMenu()
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");
}
}
@@ -177,7 +117,7 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
bool result = (mUUIDs.size() > 0);
- std::vector<LLUUID>::const_iterator
+ uuid_vec_t::const_iterator
id = mUUIDs.begin(),
uuids_end = mUUIDs.end();
@@ -200,7 +140,7 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
bool result = (mUUIDs.size() > 0);
- std::vector<LLUUID>::const_iterator
+ uuid_vec_t::const_iterator
id = mUUIDs.begin(),
uuids_end = mUUIDs.end();
@@ -226,6 +166,11 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
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 01b6e8ffad..71d16a08b4 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -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 0a7c39db46..bde8d02885 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -288,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)
@@ -827,7 +828,11 @@ void LLPanelPicks::onPanelClassifiedSave(LLPanelClassifiedEdit* panel)
else if(panel->isNewWithErrors())
{
LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(mClassifiedsList->getSelectedItem());
- c_item->fillIn(panel);
+ llassert(c_item);
+ if (c_item)
+ {
+ c_item->fillIn(panel);
+ }
}
else
{
@@ -970,6 +975,11 @@ void LLPanelPicks::onPanelClassifiedEdit()
}
LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(mClassifiedsList->getSelectedItem());
+ llassert(c_item);
+ if (!c_item)
+ {
+ return;
+ }
LLSD params;
params["classified_id"] = c_item->getClassifiedId();
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index 9e5f9da0ea..c8abcc83c4 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"
@@ -567,9 +567,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 26b57c003b..028440562d 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,9 +1031,9 @@ 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)
{
@@ -1053,8 +1083,9 @@ void LLPanelPlaces::updateVerbs()
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);
+ 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 a53a3ba1ad..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);
@@ -1010,7 +1018,7 @@ void LLPanelPrimMediaControls::updateZoom()
{
case ZOOM_NONE:
{
- gAgent.setFocusOnAvatar(TRUE, ANIMATE);
+ gAgentCamera.setFocusOnAvatar(TRUE, ANIMATE);
break;
}
case ZOOM_FAR:
@@ -1030,7 +1038,7 @@ void LLPanelPrimMediaControls::updateZoom()
}
default:
{
- gAgent.setFocusOnAvatar(TRUE, ANIMATE);
+ gAgentCamera.setFocusOnAvatar(TRUE, ANIMATE);
break;
}
}
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 90c8f2551f..e8b6c6bfe5 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,14 +563,15 @@ void LLTeleportHistoryPanel::updateVerbs()
if (!mLastSelectedFlatlList)
{
mTeleportBtn->setEnabled(false);
- mShowOnMapBtn->setEnabled(false);
+ mShowProfile->setEnabled(false);
return;
}
LLTeleportHistoryFlatItem* itemp = dynamic_cast<LLTeleportHistoryFlatItem *> (mLastSelectedFlatlList->getSelectedItem());
mTeleportBtn->setEnabled(NULL != itemp);
- mShowOnMapBtn->setEnabled(NULL != itemp);
+ mShowProfile->setEnabled(NULL != itemp);
+ mShowOnMapBtn->setEnabled(true);
}
void LLTeleportHistoryPanel::getNextTab(const LLDate& item_date, S32& tab_idx, LLDate& tab_date)
@@ -1058,3 +1079,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/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 2748daaffa..b975536f8b 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,147 @@
static const LLAvatarItemAgentOnTopComparator AGENT_ON_TOP_NAME_COMPARATOR;
+// 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 onChange()
+ {
+ 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 +200,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);
@@ -87,6 +232,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);
@@ -113,6 +264,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
@@ -129,6 +281,9 @@ LLParticipantList::~LLParticipantList()
}
mAvatarList->setContextMenu(NULL);
+ mAvatarList->setComparator(NULL);
+
+ delete mAvalineUpdater;
}
void LLParticipantList::setSpeakingIndicatorsVisible(BOOL visible)
@@ -202,6 +357,55 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)
}
}
+/*
+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 )
@@ -248,8 +452,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);
@@ -260,7 +464,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;
@@ -347,8 +551,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);
}
@@ -429,40 +644,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);
}
}
@@ -502,10 +718,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)
{
@@ -551,16 +783,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";
+ moderateVoiceOtherParticipants(LLUUID::null, unmute_all);
}
}
@@ -578,35 +811,58 @@ void LLParticipantList::LLParticipantListMenu::moderateVoiceOtherParticipants(co
LLIMSpeakerMgr* mgr = dynamic_cast<LLIMSpeakerMgr*>(mParent.mSpeakerMgr);
if (mgr)
{
+ if (!unmute)
+ {
+ LLSD payload;
+ payload["session_id"] = mgr->getSessionID();
+ payload["excluded_avatar_id"] = excluded_avatar_id;
+ LLNotificationsUtil::add("ConfirmMuteAll", LLSD(), payload, confirmMuteAllCallback);
+ return;
+ }
+
mgr->moderateVoiceOtherParticipants(excluded_avatar_id, unmute);
}
}
+// static
+void LLParticipantList::LLParticipantListMenu::confirmMuteAllCallback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option != 1)
+ {
+ return;
+ }
+
+ const LLSD& payload = notification["payload"];
+ const LLUUID& session_id = payload["session_id"];
+ const LLUUID& excluded_avatar_id = payload["excluded_avatar_id"];
+
+ LLIMSpeakerMgr * speaker_manager = dynamic_cast<LLIMSpeakerMgr*> (
+ LLIMModel::getInstance()->getSpeakerManager(session_id));
+ if (speaker_manager)
+ {
+ speaker_manager->moderateVoiceOtherParticipants(excluded_avatar_id, 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:
@@ -615,7 +871,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();
@@ -632,13 +888,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..967c8b78cf 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);
@@ -214,6 +216,8 @@ class LLParticipantList
* @see moderateVoiceParticipant()
*/
void moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute);
+
+ static void confirmMuteAllCallback(const LLSD& notification, const LLSD& response);
};
/**
@@ -235,6 +239,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 +275,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 f1e450a083..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,14 +116,14 @@ BOOL LLPlacesInventoryPanel::postBuild()
mScroller = LLUICtrlFactory::create<LLScrollContainer>(p);
}
addChild(mScroller);
- mScroller->addChild(mFolders);
+ mScroller->addChild(mFolderRoot);
- mFolders->setScrollContainer(mScroller);
- mFolders->addChild(mFolders->mStatusTextBox);
+ mFolderRoot->setScrollContainer(mScroller);
+ mFolderRoot->addChild(mFolderRoot->mStatusTextBox);
// cut subitems
- mFolders->setUseEllipses(true);
+ mFolderRoot->setUseEllipses(true);
return TRUE;
}
@@ -131,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)
@@ -151,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;
diff --git a/indra/newview/llpopupview.cpp b/indra/newview/llpopupview.cpp
index d8ad59c90c..4523bf2ba4 100644
--- a/indra/newview/llpopupview.cpp
+++ b/indra/newview/llpopupview.cpp
@@ -104,14 +104,18 @@ BOOL LLPopupView::handleMouseEvent(boost::function<BOOL(LLView*, S32, S32)> func
S32 x, S32 y,
bool close_popups)
{
- for (popup_list_t::iterator popup_it = mPopups.begin();
- popup_it != mPopups.end();)
+ 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))
{
- ++popup_it;
continue;
}
@@ -121,23 +125,19 @@ BOOL LLPopupView::handleMouseEvent(boost::function<BOOL(LLView*, S32, S32)> func
{
if (func(popup, popup_x, popup_y))
{
- return TRUE;
+ handled = TRUE;
+ break;
}
}
if (close_popups)
{
- popup_list_t::iterator cur_popup_it = popup_it++;
- mPopups.erase(cur_popup_it);
+ mPopups.remove(*popup_it);
popup->onTopLost();
}
- else
- {
- ++popup_it;
- }
}
- return FALSE;
+ return handled;
}
@@ -207,11 +207,7 @@ void LLPopupView::addPopup(LLView* popup)
{
if (popup)
{
- popup_list_t::iterator iter = std::find(mPopups.begin(), mPopups.end(), popup->getHandle());
- if(iter != mPopups.end())
- {
- mPopups.erase(iter);
- }
+ mPopups.remove(popup->getHandle());
mPopups.push_front(popup->getHandle());
}
}
@@ -220,11 +216,7 @@ void LLPopupView::removePopup(LLView* popup)
{
if (popup)
{
- popup_list_t::iterator iter = std::find(mPopups.begin(), mPopups.end(), popup->getHandle());
- if(iter != mPopups.end())
- {
- mPopups.erase(iter);
- }
+ mPopups.remove(popup->getHandle());
popup->onTopLost();
}
}
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 0cc747f789..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());
}
@@ -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 57a8ca3d12..2e061b235d 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -42,6 +42,10 @@
#include "llstring.h"
#include "lldir.h"
#include "llfloaterreg.h"
+#include "llinventorydefines.h"
+#include "llinventoryfunctions.h"
+#include "llinventorymodel.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llmultigesture.h"
#include "llnotificationsutil.h"
#include "llvfile.h"
@@ -56,7 +60,6 @@
#include "lldelayedgestureerror.h"
#include "llfloatergesture.h" // for some label constants
#include "llgesturemgr.h"
-#include "llinventorymodel.h"
#include "llkeyboard.h"
#include "lllineeditor.h"
#include "llradiogroup.h"
@@ -97,7 +100,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 +134,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 +272,7 @@ BOOL LLPreviewGesture::canClose()
// virtual
void LLPreviewGesture::onClose(bool app_quitting)
{
- LLGestureManager::instance().stopGesture(mPreviewGesture);
+ LLGestureMgr::instance().stopGesture(mPreviewGesture);
}
// virtual
@@ -293,13 +296,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;
@@ -645,7 +648,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 +787,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
@@ -1138,10 +1141,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 +1705,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 +1750,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/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index ee8e3f1db6..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,11 +93,17 @@ 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());
+ 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 f5a9f82d50..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"
@@ -1090,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;
@@ -1579,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;
}
@@ -1823,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/llprogressview.cpp b/indra/newview/llprogressview.cpp
index 120b584cd9..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,19 +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)
{
- gViewerWindow->addPopup(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);
}
}
@@ -148,7 +156,7 @@ void LLProgressView::draw()
static LLTimer timer;
// Paint bitmap if we've got one
- glPushMatrix();
+ glPushMatrix();
if (gStartTexture)
{
LLGLSUIDefault gls_ui;
@@ -189,7 +197,7 @@ void LLProgressView::draw()
// Fade is complete, release focus
gFocusMgr.releaseFocusIfNeeded( this );
LLPanel::setVisible(FALSE);
- gViewerWindow->removePopup(this);
+ mFadeTimer.stop();
gStartTexture = NULL;
}
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/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index a4426b370e..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>
@@ -480,7 +479,9 @@ void LLScreenChannel::showToastsBottom()
}
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())
@@ -580,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;
@@ -591,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);
@@ -710,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();
}
}
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 f35cb3516a..b68fc3b002 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -482,7 +482,7 @@ std::string LLScriptFloaterManager::getObjectName(const LLUUID& notification_id)
text = notification->getSubstitutions()["OBJECTNAME"].asString();
break;
case LLScriptFloaterManager::OBJ_GIVE_INVENTORY:
- text = notification->getSubstitutions()["NAME"].asString();
+ text = notification->getSubstitutions()["OBJECTFROMNAME"].asString();
break;
default:
text = LLTrans::getString("object");
@@ -539,4 +539,14 @@ bool LLScriptFloaterManager::getFloaterPosition(const LLUUID& object_id, Floater
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 ec3ec4b540..dc0cfc2400 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -99,6 +99,8 @@ public:
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;
diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp
index 32a915608e..242af6981c 100644
--- a/indra/newview/llscrollingpanelparam.cpp
+++ b/indra/newview/llscrollingpanelparam.cpp
@@ -42,17 +42,14 @@
#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
@@ -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);
+ 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 );
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..fe4ce07166 100644
--- a/indra/newview/llscrollingpanelparam.h
+++ b/indra/newview/llscrollingpanelparam.h
@@ -75,13 +75,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/llsecapi.cpp b/indra/newview/llsecapi.cpp
new file mode 100644
index 0000000000..1caeec5b04
--- /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
+ LLProtectedDataException ex = LLProtectedDataException("");
+ 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)
+ {
+ ex = e;
+ }
+ }
+ if (ex.getMessage().length() > 0 ) // an exception was thrown.
+ {
+ throw ex;
+ }
+
+}
+// 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.
+ chain->validate(VALIDATION_POLICY_SSL & (~VALIDATION_POLICY_HOSTNAME), store, 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..59a1e1eff0
--- /dev/null
+++ b/indra/newview/llsecapi.h
@@ -0,0 +1,499 @@
+/**
+ * @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 LLSD getLLSD() const=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 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;
+};
+
+// 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() {}
+
+ // validate a certificate chain given the params.
+ // Will throw exceptions on error
+
+ virtual void validate(int validation_policy,
+ LLPointer<LLCertificateStore> ca_store,
+ 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..edf5ce9b60
--- /dev/null
+++ b/indra/newview/llsechandler_basic.cpp
@@ -0,0 +1,1613 @@
+/**
+ * @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>
+
+
+
+// 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);
+ }
+ _initLLSD();
+}
+
+
+LLBasicCertificate::LLBasicCertificate(X509* pCert)
+{
+ if (!pCert || !pCert->cert_info)
+ {
+ throw LLInvalidCertificate(this);
+ }
+ mCert = X509_dup(pCert);
+ _initLLSD();
+}
+
+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;
+}
+
+
+LLSD LLBasicCertificate::getLLSD() const
+{
+ return 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();
+ 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();
+ 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());
+ 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();
+ // 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,
+ const LLPointer<LLCertificate> cert,
+ const LLSD& validation_params,
+ int depth)
+{
+
+ LLSD current_cert_info = cert->getLLSD();
+ // 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 = parent->getLLSD();
+ LLSD cert2 = child->getLLSD();
+ 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 LLBasicCertificateChain::validate(int validation_policy,
+ LLPointer<LLCertificateStore> ca_store,
+ const LLSD& validation_params)
+{
+
+ if(size() < 1)
+ {
+ throw LLCertException(NULL, "No certs in chain");
+ }
+ iterator current_cert = begin();
+ LLSD current_cert_info = (*current_cert)->getLLSD();
+ LLSD validation_date;
+ if (validation_params.has(CERT_VALIDATION_DATE))
+ {
+ validation_date = validation_params[CERT_VALIDATION_DATE];
+ }
+
+ if (validation_policy & VALIDATION_POLICY_HOSTNAME)
+ {
+ 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_INFOS("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));
+ }
+ }
+
+
+ int depth = 0;
+ LLPointer<LLCertificate> previous_cert;
+ // loop through the cert chain, validating the current cert against the next one.
+ while(current_cert != end())
+ {
+
+ int local_validation_policy = validation_policy;
+ if(current_cert == 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_llsd = (*current_cert)->getLLSD();
+ LLSD cert_search_params = LLSD::emptyMap();
+ // is the cert itself in the store?
+ cert_search_params[CERT_SHA1_DIGEST] = cert_llsd[CERT_SHA1_DIGEST];
+ LLCertificateStore::iterator found_store_cert = ca_store->find(cert_search_params);
+ if(found_store_cert != ca_store->end())
+ {
+ return;
+ }
+
+ // is the parent in the cert store?
+
+ cert_search_params = LLSD::emptyMap();
+ cert_search_params[CERT_SUBJECT_NAME_STRING] = cert_llsd[CERT_ISSUER_NAME_STRING];
+ if (cert_llsd.has(CERT_AUTHORITY_KEY_IDENTIFIER))
+ {
+ LLSD cert_aki = cert_llsd[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 = ca_store->find(cert_search_params);
+
+ if(found_store_cert != ca_store->end())
+ {
+ LLSD foo = (*found_store_cert)->getLLSD();
+ // 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.
+ return;
+ }
+ previous_cert = (*current_cert);
+ current_cert++;
+ depth++;
+ }
+ if (validation_policy & VALIDATION_POLICY_TRUSTED)
+ {
+ LLPointer<LLCertificate> untrusted_ca_cert = (*this)[size()-1];
+ // we reached the end without finding a trusted cert.
+ throw LLCertValidationTrustException((*this)[size()-1]);
+
+ }
+}
+
+
+// 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_INFOS("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 MACAddress[MAC_ADDRESS_BYTES];
+ LLUUID::getNodeID(MACAddress);
+ LLXORCipher cipher(MACAddress, MAC_ADDRESS_BYTES);
+
+ // 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 MACAddress[MAC_ADDRESS_BYTES];
+ LLUUID::getNodeID(MACAddress);
+ LLXORCipher cipher(MACAddress, MAC_ADDRESS_BYTES);
+ 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_INFOS("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 MACAddress[MAC_ADDRESS_BYTES];
+ LLUUID::getNodeID(MACAddress);
+ LLXORCipher cipher(MACAddress, 6);
+ 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..4bbb73f062
--- /dev/null
+++ b/indra/newview/llsechandler_basic.h
@@ -0,0 +1,285 @@
+/**
+ * @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 LLSD getLLSD() const;
+
+ 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());
+ 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;
+
+protected:
+ std::vector<LLPointer<LLCertificate> >mCerts;
+ 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() {}
+
+ // validate a certificate chain against a certificate store, using the
+ // given validation policy.
+ virtual void validate(int validation_policy,
+ LLPointer<LLCertificateStore> ca_store,
+ const LLSD& validation_params);
+};
+
+
+
+// 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 d733574a9d..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,12 +4911,11 @@ 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);
@@ -4936,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();
@@ -5021,7 +5022,7 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
}
}
- if (for_hud && avatar)
+ if (isAgentAvatarValid() && for_hud)
{
glMatrixMode(GL_PROJECTION);
gGL.popMatrix();
@@ -5206,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);
@@ -5397,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
{
@@ -5419,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);
@@ -5534,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)
{
@@ -5608,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;
@@ -5640,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;
@@ -5713,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);
}
}
@@ -5922,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..d315f40ff3 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
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 4a24a5dec5..3719313c14 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"
@@ -43,18 +44,22 @@
#include "llfoldervieweventlistener.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() {}
@@ -92,8 +97,9 @@ LLSidepanelAppearance::LLSidepanelAppearance() :
LLPanel(),
mFilterSubString(LLStringUtil::null),
mFilterEditor(NULL),
- mLookInfo(NULL),
- mCurrOutfitPanel(NULL)
+ mOutfitEdit(NULL),
+ mCurrOutfitPanel(NULL),
+ mOpened(false)
{
}
@@ -112,8 +118,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));
@@ -128,13 +133,13 @@ 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,13 +150,13 @@ 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");
@@ -164,29 +169,36 @@ 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();
+ }
}
-
- if(key.size() == 0)
- return;
-
- toggleLookInfoPanel(TRUE);
- updateVerbs();
-
- mLookInfoType = key["type"].asString();
-
- if (mLookInfoType == "look")
+ else
{
- LLInventoryCategory *pLook = gInventory.getCategory(key["id"].asUUID());
- if (pLook)
- mLookInfo->displayLookInfo(pLook);
+ // 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();
+ }
}
+
+ mOpened = true;
}
void LLSidepanelAppearance::onFilterEdit(const std::string& search_string)
@@ -196,8 +208,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 +216,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,112 +229,153 @@ 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::togglMyOutfitsPanel(BOOL visible)
+{
+ if (!mPanelOutfitsInventory || mPanelOutfitsInventory->getVisible() == visible)
+ {
+ // visibility isn't changing, hence nothing to do
+ return;
+ }
+
+ mPanelOutfitsInventory->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::toggleLookInfoPanel(BOOL visible)
+void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible, BOOL disable_camera_switch)
{
- if (!mLookInfo)
+ if (!mOutfitEdit || mOutfitEdit->getVisible() == visible)
+ {
+ // visibility isn't changing, hence nothing to do
return;
+ }
- mLookInfo->setVisible(visible);
- if (mPanelOutfitsInventory) mPanelOutfitsInventory->setVisible(!visible);
- mFilterEditor->setVisible(!visible);
- mEditBtn->setVisible(!visible);
- mNewOutfitBtn->setVisible(!visible);
- mCurrOutfitPanel->setVisible(!visible);
+ 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();
+ }
}
-void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable)
+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);
- mEditWearable->setWearable(wearable);
- mFilterEditor->setVisible(!visible);
- mPanelOutfitsInventory->setVisible(!visible);
-}
-void LLSidepanelAppearance::updateVerbs()
-{
- bool is_look_info_visible = mLookInfo->getVisible();
-
- if (mPanelOutfitsInventory && !is_look_info_visible)
+ if (visible)
{
- const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL);
- mEditBtn->setEnabled(is_correct_type);
+ mEditWearable->setWearable(wearable);
+ mEditWearable->onOpen(LLSD()); // currently no-op, just for consistency
+ if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") )
+ {
+ gAgentCamera.changeCameraToCustomizeAvatar();
+ }
}
else
{
- mEditBtn->setEnabled(FALSE);
+ // Save changes if closing.
+ mEditWearable->saveChanges();
+ if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") )
+ {
+ gAgentCamera.changeCameraToDefault();
+ }
}
}
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;
@@ -340,11 +392,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
@@ -353,23 +407,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;
@@ -386,11 +441,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();
}
@@ -404,3 +459,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..5bde962c8d 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -36,7 +36,7 @@
#include "llinventoryobserver.h"
#include "llinventory.h"
-#include "llpanellookinfo.h"
+#include "llpaneloutfitedit.h"
class LLFilterEditor;
class LLCurrentlyWornFetchObserver;
@@ -47,6 +47,7 @@ class LLPanelOutfitsInventory;
class LLSidepanelAppearance : public LLPanel
{
+ LOG_CLASS(LLSidepanelAppearance);
public:
LLSidepanelAppearance();
virtual ~LLSidepanelAppearance();
@@ -56,37 +57,41 @@ 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 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;
@@ -98,9 +103,8 @@ private:
// 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 73880563d7..fc5143d33b 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");
@@ -69,6 +71,9 @@ BOOL LLSidepanelInventory::postBuild()
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));
@@ -151,6 +156,12 @@ void LLSidepanelInventory::onInfoButtonClicked()
void LLSidepanelInventory::onShareButtonClicked()
{
+ LLAvatarActions::shareWithAvatars();
+}
+
+void LLSidepanelInventory::onShopButtonClicked()
+{
+ LLWeb::loadURLExternal(gSavedSettings.getString("MarketplaceURL"));
}
void LLSidepanelInventory::performActionOnSelection(const std::string &action)
@@ -161,7 +172,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()
@@ -252,7 +263,9 @@ void LLSidepanelInventory::updateVerbs()
mPlayBtn->setEnabled(FALSE);
mTeleportBtn->setVisible(FALSE);
mTeleportBtn->setEnabled(FALSE);
-
+
+ mShareBtn->setEnabled(canShare());
+
const LLInventoryItem *item = getSelectedItem();
if (!item)
return;
@@ -260,7 +273,6 @@ void LLSidepanelInventory::updateVerbs()
bool is_single_selection = getSelectedCount() == 1;
mInfoBtn->setEnabled(is_single_selection);
- mShareBtn->setEnabled(is_single_selection);
switch(item->getInventoryType())
{
@@ -285,6 +297,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");
@@ -301,8 +332,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..2dc17e741d 100644
--- a/indra/newview/llsidepanelinventory.h
+++ b/indra/newview/llsidepanelinventory.h
@@ -60,6 +60,7 @@ 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();
@@ -78,6 +79,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 0275736f6d..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"
@@ -235,7 +236,7 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* 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();
@@ -439,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;
@@ -742,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);
@@ -752,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
@@ -760,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
@@ -768,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())
@@ -872,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);
@@ -880,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 6ebe55e362..e76397671b 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -125,10 +125,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;
@@ -137,9 +135,12 @@ void LLSidepanelTaskInfo::setVisible(BOOL visible)
else
{
sActivePanel = NULL;
+ // drop selection reference
+ mObjectSelection = NULL;
}
}
+
void LLSidepanelTaskInfo::disableAll()
{
childSetEnabled("perm_modify", FALSE);
diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h
index e41627435f..15274c90db 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);
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index fba1503b4a..9159f42968 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -34,7 +34,7 @@
#include "lltextbox.h"
-#include "llagent.h"
+#include "llagentcamera.h"
#include "llbottomtray.h"
#include "llsidetray.h"
#include "llviewerwindow.h"
@@ -66,6 +66,21 @@ static const std::string TAB_PANEL_CAPTION_TITLE_BOX = "sidetray_tab_title";
LLSideTray* LLSideTray::sInstance = 0;
+/**
+ * Updates visibility of sidetray tabs buttons according to "SidebarWithButtonsVisibility" setting
+ *
+ * @param force_set_visible if true method ignores setting value and set buttons visible.
+ */
+static void update_tabs_buttons_visibility(bool force_set_visible = false)
+{
+ LLView* side_bar_tabs = gViewerWindow->getRootView()->getChildView("side_bar_tabs");
+ if (side_bar_tabs)
+ {
+ BOOL visible = LLUI::sSettingGroups["config"]->getBOOL("SidebarWithButtonsVisibility");
+ side_bar_tabs->setVisible(force_set_visible || visible);
+ }
+}
+
LLSideTray* LLSideTray::getInstance()
{
if (!sInstance)
@@ -258,6 +273,8 @@ LLSideTray::LLSideTray(Params& params)
p.name = "buttons_panel";
p.mouse_opaque = false;
mButtonsPanel = LLUICtrlFactory::create<LLPanel>(p);
+
+ initControlSettings();
}
@@ -547,6 +564,7 @@ void LLSideTray::collapseSideBar()
reflectCollapseChange();
setFocus( FALSE );
+ update_tabs_buttons_visibility();
}
void LLSideTray::expandSideBar()
@@ -572,6 +590,7 @@ void LLSideTray::expandSideBar()
btn->setImageOverlay( mActiveTab->mImageSelected );
}
+ update_tabs_buttons_visibility(true);
}
void LLSideTray::highlightFocused()
@@ -638,6 +657,9 @@ LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& para
{
panel->onOpen(params);
}
+
+ update_tabs_buttons_visibility(true);
+
return panel;
}
}
@@ -720,17 +742,44 @@ 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());
+ }
+}
+
+void LLSideTray::initControlSettings()
+{
+ // set listeners to process runtime setting changes
+ LLUI::sSettingGroups["config"]->getControl("SidebarWithButtonsVisibility")->getSignal()->connect(boost::bind(&LLSideTray::toggleSidetrayAndTabButtonsVisibility, this, _2));
+
+ // update visibility according to current value
+ toggleSidetrayAndTabButtonsVisibility(LLUI::sSettingGroups["config"]->getBOOL("SidebarWithButtonsVisibility"));
+}
+
+// sidebar visibility is implemented via its expanding/collapsing
+void LLSideTray::toggleSidetrayAndTabButtonsVisibility(const LLSD::Boolean& new_visibility)
+{
+ // If new_visibility==FALSE it gets invisible but still can be expanded in other ways (Ctrl+I to see My Inventory)
+
+ // store collapsed state to restore it properly on next call
+ static bool was_collapsed = false;
+
+ if (!new_visibility && !mCollapsed)
+ {
+ collapseSideBar();
+ was_collapsed = true;
}
+ // should be visible: expand only if it was expanded when has been collapsed on previous call
+ else if (new_visibility && was_collapsed)
+ {
+ if (mCollapsed) expandSideBar();
+ was_collapsed = false;
+ }
+
+ update_tabs_buttons_visibility(new_visibility);
}
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index 140a9c818a..ed6b376d5c 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)
@@ -179,6 +179,16 @@ private:
LLSideTray::getInstance()->setEnabled(FALSE);
}
+ /**
+ * Initializes listener of SidebarWithButtonsVisibility setting and updates state according to it.
+ */
+ void initControlSettings();
+
+ /**
+ * Updates Sidebar and its Tab Buttons visibility according to passed value.
+ */
+ void toggleSidetrayAndTabButtonsVisibility(const LLSD::Boolean& new_visibility);
+
private:
LLPanel* mButtonsPanel;
diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp
index 5d20e280b5..ff7e479368 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,155 +34,443 @@
#include "llslurl.h"
-#include "llweb.h"
-
-#include "llurlregistry.h"
-
-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/";
-
-// For DnD - even though www.slurl.com redirects to slurl.com in a browser, you can copy and drag
+#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_SLURL_WWW = "http://www.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::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))
- {
- stripped.erase(0, PREFIX_SECONDLIFE.length());
- }
- else if (matchPrefix(stripped, PREFIX_SLURL))
+ // by default we go to agni.
+ mType = INVALID;
+ LL_INFOS("AppInit") << "SLURL: " << slurl << LL_ENDL;
+ if(slurl == SIM_LOCATION_HOME)
{
- stripped.erase(0, PREFIX_SLURL.length());
+ mType = HOME_LOCATION;
}
- else if (matchPrefix(stripped, PREFIX_SLURL_OLD))
+ else if(slurl.empty() || (slurl == SIM_LOCATION_LAST))
{
- stripped.erase(0, PREFIX_SLURL_OLD.length());
+
+ mType = LAST_LOCATION;
}
- else if (matchPrefix(stripped, PREFIX_SLURL_WWW))
+ else
{
- stripped.erase(0, PREFIX_SLURL_WWW.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))
+ {
+ // 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;
}
-// static
-bool LLSLURL::isSLURL(const std::string& url)
+
+// Create a slurl for the middle of the region
+LLSLURL::LLSLURL(const std::string& grid,
+ const std::string& region)
{
- 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;
- if (matchPrefix(url, PREFIX_SLURL_WWW)) return true;
-
- return false;
+ mGrid = grid;
+ mRegion = region;
+ mType = LOCATION;
+ mPosition = LLVector3((F64)REGION_WIDTH_METERS/2, (F64)REGION_WIDTH_METERS/2, 0);
}
-bool LLSLURL::isValidSLURL(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)
{
- std::string temp_url(url);
- //"www." may appear in DnD- see description of PREFIX_SLURL_WWW.
- // If it is found, we remove it because it isn't expected in regexp.
- if (matchPrefix(url, PREFIX_SLURL_WWW))
- {
- size_t position = url.find("www.");
- temp_url.erase(position,4);
- }
-
- return LLUrlRegistry::getInstance()->isUrl(temp_url);
+ 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_WWW + 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
+{
+ 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
{
- 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]);
+ 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 a79a8fc97c..1210c398f1 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,85 +29,84 @@
* 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 PREFIX_SLURL_WWW;
-
- static const std::string APP_TOKEN;
-
- /**
- * Is this any sort of secondlife:// or sl:// URL?
- */
- static bool isSLURL(const std::string& url);
-
- /**
- * Returns true if url is proven valid by regexp check from LLUrlRegistry
- */
- static bool isValidSLURL(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* 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/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 717a8bda1e..9da3db3032 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)
@@ -300,7 +299,7 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin
void LLSpeakerMgr::update(BOOL resort_ok)
{
- if (!gVoiceClient)
+ if (!LLVoiceClient::getInstance())
{
return;
}
@@ -314,7 +313,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;
@@ -322,21 +321,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)
@@ -418,19 +417,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));
- }
}
}
}
@@ -520,7 +521,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();
}
@@ -528,6 +529,7 @@ BOOL LLSpeakerMgr::isVoiceActive()
// LLIMSpeakerMgr
//
LLIMSpeakerMgr::LLIMSpeakerMgr(LLVoiceChannel* channel) : LLSpeakerMgr(channel)
+, mVoiceModerated(false)
{
}
@@ -782,21 +784,33 @@ void LLIMSpeakerMgr::moderateVoiceOtherParticipants(const LLUUID& excluded_avata
*/
mReverseVoiceModeratedAvatarID = excluded_avatar_id;
- moderateVoiceSession(getSessionID(), !unmute_everyone_else);
+
+
+ if (mVoiceModerated == !unmute_everyone_else)
+ {
+ // 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_else);
+ }
}
void LLIMSpeakerMgr::processSessionUpdate(const LLSD& session_update)
{
- if (mReverseVoiceModeratedAvatarID.isNull()) return;
-
if (session_update.has("moderated_mode") &&
session_update["moderated_mode"].has("voice"))
{
- BOOL voice_moderated = session_update["moderated_mode"]["voice"];
+ mVoiceModerated = session_update["moderated_mode"]["voice"];
- moderateVoiceParticipant(mReverseVoiceModeratedAvatarID, voice_moderated);
+ if (mReverseVoiceModeratedAvatarID.notNull())
+ {
+ moderateVoiceParticipant(mReverseVoiceModeratedAvatarID, mVoiceModerated);
- mReverseVoiceModeratedAvatarID = LLUUID::null;
+ mReverseVoiceModeratedAvatarID = LLUUID::null;
+ }
}
}
@@ -816,6 +830,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
@@ -880,7 +908,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 b924fb2f2c..b38acb7bc4 100644
--- a/indra/newview/llspeakers.h
+++ b/indra/newview/llspeakers.h
@@ -234,6 +234,14 @@ 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); }
+
protected:
virtual void updateSpeakerList();
void setSpeakerNotInChannel(LLSpeaker* speackerp);
@@ -295,7 +303,15 @@ protected:
void moderateVoiceSession(const LLUUID& session_id, bool disallow_voice);
+ /**
+ * Process all participants to mute/unmute them according to passed voice session state.
+ */
+ void forceVoiceModeratedMode(bool should_be_muted);
+
+private:
LLUUID mReverseVoiceModeratedAvatarID;
+ bool mVoiceModerated;
+
};
class LLActiveSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLActiveSpeakerMgr>
diff --git a/indra/newview/llspeakingindicatormanager.cpp b/indra/newview/llspeakingindicatormanager.cpp
index cc06179481..29237946d2 100644
--- a/indra/newview/llspeakingindicatormanager.cpp
+++ b/indra/newview/llspeakingindicatormanager.cpp
@@ -158,7 +158,7 @@ void SpeakingIndicatorManager::registerSpeakingIndicator(const LLUUID& speaker_i
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);
@@ -210,7 +210,7 @@ void SpeakingIndicatorManager::onChange()
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
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 025dd6029a..d8b5618d8f 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,6 +117,7 @@
#include "llimagebmp.h"
#include "llinventorybridge.h"
#include "llinventorymodel.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llfriendcard.h"
#include "llkeyboard.h"
#include "llloginhandler.h" // gLoginHandler, SLURL support
@@ -144,7 +147,7 @@
#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,6 +192,7 @@
#include "llinventorybridge.h"
#include "llappearancemgr.h"
#include "llavatariconctrl.h"
+#include "llvoicechannel.h"
#include "lllogin.h"
#include "llevents.h"
@@ -221,15 +225,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;
@@ -246,7 +251,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);
@@ -259,6 +263,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);
@@ -361,7 +368,7 @@ bool idle_startup()
if ( STATE_FIRST == LLStartUp::getStartupState() )
{
- gViewerWindow->showCursor();
+ gViewerWindow->showCursor();
gViewerWindow->getWindow()->setCursor(UI_CURSOR_WAIT);
/////////////////////////////////////////////////
@@ -378,13 +385,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;
@@ -561,7 +577,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");
@@ -659,69 +675,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;
@@ -753,8 +725,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;
@@ -765,8 +739,10 @@ bool idle_startup()
// 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);
@@ -833,42 +809,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")));
@@ -886,21 +859,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());
@@ -921,11 +892,7 @@ bool idle_startup()
if (show_connect_box)
{
- std::string location;
- LLPanelLogin::getLocation( location );
- LLURLSimString::setString( location );
-
- // END TODO
+ LLSLURL slurl;
LLPanelLogin::closePanel();
}
@@ -937,6 +904,9 @@ bool idle_startup()
// Load Avatars icons cache
LLAvatarIconIDCache::getInstance()->load();
+
+ // Load media plugin cookies
+ LLViewerMedia::loadCookieFile();
//-------------------------------------------------
// Handle startup progress screen
@@ -946,26 +916,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);
@@ -992,7 +957,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");
@@ -1016,11 +981,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;
@@ -1040,15 +1001,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())
{
@@ -1068,8 +1030,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"
@@ -1082,18 +1044,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);
@@ -1106,7 +1115,12 @@ 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();
+ // update the voice settings
+ LLVoiceClient::getInstance()->updateSettings();
+ LLGridManager::getInstance()->setFavorite();
LLStartUp::setStartupState( STATE_WORLD_INIT);
}
else
@@ -1117,6 +1131,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;
@@ -1134,6 +1149,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
@@ -1172,7 +1188,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
@@ -1336,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)
@@ -1741,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)
{
@@ -1755,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
@@ -1764,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;
@@ -1800,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
@@ -1810,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")
- {
- msg = "AvatarMovedHome";
- }
- else
+ switch(start_slurl.getType())
{
- 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();
@@ -1859,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
@@ -1867,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 );
@@ -1923,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 );
@@ -2050,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.
@@ -2079,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
@@ -2104,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);
@@ -2281,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:
@@ -2501,37 +2377,42 @@ void asset_callback_nothing(LLVFS*, const LLUUID&, LLAssetType::EType, void*, S3
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 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::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);
@@ -2559,16 +2440,18 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
}
else
{
+ sWearablesLoadedCon = gAgentWearables.addLoadedCallback(LLStartUp::saveInitialOutfit);
+
bool do_copy = true;
bool do_append = false;
LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
- LLAppearanceManager::instance().wearInventoryCategory(cat, do_copy, do_append);
+ LLAppearanceMgr::instance().wearInventoryCategory(cat, do_copy, do_append);
}
// Copy gestures
LLUUID dst_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
LLPointer<LLInventoryCallback> cb(NULL);
- LLAppearanceManager *app_mgr = &(LLAppearanceManager::instance());
+ LLAppearanceMgr *app_mgr = &(LLAppearanceMgr::instance());
// - Copy gender-specific gestures.
LLUUID gestures_cat_id = findDescendentCategoryIDByName(
@@ -2577,7 +2460,7 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
if (gestures_cat_id.notNull())
{
callAfterCategoryFetch(gestures_cat_id,
- boost::bind(&LLAppearanceManager::shallowCopyCategory,
+ boost::bind(&LLAppearanceMgr::shallowCopyCategory,
app_mgr,
gestures_cat_id,
dst_id,
@@ -2591,7 +2474,7 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
if (common_gestures_cat_id.notNull())
{
callAfterCategoryFetch(common_gestures_cat_id,
- boost::bind(&LLAppearanceManager::shallowCopyCategory,
+ boost::bind(&LLAppearanceMgr::shallowCopyCategory,
app_mgr,
common_gestures_cat_id,
dst_id,
@@ -2604,6 +2487,24 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
}
+//static
+void LLStartUp::saveInitialOutfit()
+{
+ if (sInitialOutfit.empty()) return;
+
+ if (sWearablesLoadedCon.connected())
+ {
+ sWearablesLoadedCon.disconnect();
+ }
+
+ LLAppearanceMgr::getInstance()->makeNewOutfitLinks(sInitialOutfit);
+}
+
+std::string& LLStartUp::getInitialOutfitName()
+{
+ return sInitialOutfit;
+}
+
// Loads a bitmap to display during load
void init_start_screen(S32 location_id)
{
@@ -2719,6 +2620,8 @@ void LLStartUp::postStartupState()
void reset_login()
{
+ gAgentWearables.cleanup();
+ gAgentCamera.cleanup();
gAgent.cleanup();
LLWorld::getInstance()->destroyClass();
@@ -2737,7 +2640,6 @@ void reset_login()
//---------------------------------------------------------------------------
-std::string LLStartUp::sSLURLCommand;
bool LLStartUp::canGoFullscreen()
{
@@ -2770,41 +2672,145 @@ 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();
+ // 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)
{
@@ -2852,33 +2858,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
@@ -2972,7 +2990,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);
}
@@ -3035,6 +3053,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())
{
@@ -3078,10 +3127,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..e1e108ca6a 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();
@@ -101,26 +102,22 @@ public:
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 9206b4a43a..5628205dd4 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -36,10 +36,12 @@
// 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"
@@ -313,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
@@ -371,6 +373,8 @@ void LLStatusBar::setVisibleForMouselook(bool visible)
mTextTime->setVisible(visible);
getChild<LLUICtrl>("buycurrency")->setVisible(visible);
getChild<LLUICtrl>("buyL")->setVisible(visible);
+ mBtnVolume->setVisible(visible);
+ mMediaToggle->setVisible(visible);
mSGBandwidth->setVisible(visible);
mSGPacketLoss->setVisible(visible);
setBackgroundVisible(visible);
@@ -444,11 +448,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");
}
@@ -508,7 +510,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* )
diff --git a/indra/newview/llstylemap.cpp b/indra/newview/llstylemap.cpp
index 61705c4eb3..8fab3bb361 100644
--- a/indra/newview/llstylemap.cpp
+++ b/indra/newview/llstylemap.cpp
@@ -51,7 +51,7 @@ const LLStyle::Params &LLStyleMap::lookupAgent(const LLUUID &source)
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
{
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 66373feb93..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,7 +204,7 @@ 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();
- if (isDocked()) // Don't reshape undocked Well window. See EXT-5715.
+ 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();
@@ -250,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;
}
/************************************************************************/
@@ -551,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));
@@ -747,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
{
@@ -774,7 +697,7 @@ void LLIMWellWindow::delIMRow(const LLUUID& sessionId)
if (mMessageList->removeItemByValue(sessionId))
{
- handleItemRemoved(IT_INSTANT_MESSAGE);
+ mSysWellChiclet->updateWidget(isWindowEmpty());
}
else
{
@@ -802,9 +725,9 @@ void LLIMWellWindow::addObjectRow(const LLUUID& notification_id, bool new_messag
if (mMessageList->getItemByValue(notification_id) == NULL)
{
ObjectRowPanel* item = new ObjectRowPanel(notification_id, new_message);
- if (mMessageList->insertItemAfter(mSeparator, item, notification_id))
+ if (mMessageList->addItem(item, notification_id))
{
- handleItemAdded(IT_INSTANT_MESSAGE);
+ mSysWellChiclet->updateWidget(isWindowEmpty());
}
else
{
@@ -819,7 +742,7 @@ void LLIMWellWindow::removeObjectRow(const LLUUID& notification_id)
{
if (mMessageList->removeItemByValue(notification_id))
{
- handleItemRemoved(IT_INSTANT_MESSAGE);
+ mSysWellChiclet->updateWidget(isWindowEmpty());
}
else
{
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index 3790aa3ea9..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;
};
/**
diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp
index dcc85392f7..15684337f4 100644
--- a/indra/newview/llteleporthistory.cpp
+++ b/indra/newview/llteleporthistory.cpp
@@ -136,6 +136,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 +167,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/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/lltexlayer.cpp b/indra/newview/lltexlayer.cpp
index 386b636367..4be03596f8 100644
--- a/indra/newview/lltexlayer.cpp
+++ b/indra/newview/lltexlayer.cpp
@@ -99,6 +99,12 @@ LLTexLayerSetBuffer::~LLTexLayerSetBuffer()
}
//virtual
+S8 LLTexLayerSetBuffer::getType() const
+{
+ return LLViewerDynamicTexture::LL_TEX_LAYER_SET_BUFFER ;
+}
+
+//virtual
void LLTexLayerSetBuffer::restoreGLTexture()
{
LLViewerDynamicTexture::restoreGLTexture() ;
@@ -166,12 +172,13 @@ void LLTexLayerSetBuffer::popProjection() const
BOOL LLTexLayerSetBuffer::needsRender()
{
- const LLVOAvatarSelf* avatar = mTexLayerSet->getAvatar();
+ llassert(mTexLayerSet->getAvatar() == gAgentAvatarp);
+ if (!isAgentAvatarValid()) return FALSE;
BOOL upload_now = mNeedsUpload && mTexLayerSet->isLocalTextureDataFinal() && gAgentQueryManager.hasNoPendingQueries();
- BOOL needs_update = (mNeedsUpdate || upload_now) && !avatar->mAppearanceAnimating;
+ 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,7 +188,6 @@ BOOL LLTexLayerSetBuffer::needsRender()
}
else
{
- needs_update &= (avatar->isSelf() || (avatar->isVisible() && !avatar->isCulled()));
needs_update &= mTexLayerSet->isLocalTextureDataAvailable();
}
}
@@ -231,6 +237,7 @@ BOOL LLTexLayerSetBuffer::render()
{
if (mTexLayerSet->isVisible())
{
+ mTexLayerSet->getAvatar()->debugBakedTextureUpload(mTexLayerSet->getBakedTexIndex(), FALSE); // FALSE for start of upload, TRUE for finish.
readBackAndUpload();
}
else
@@ -284,8 +291,6 @@ void LLTexLayerSetBuffer::readBackAndUpload()
llinfos << "Baked " << mTexLayerSet->getBodyRegion() << 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.)
@@ -352,7 +357,7 @@ void LLTexLayerSetBuffer::readBackAndUpload()
{
// 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);
+ new LLBakedUploadData(gAgentAvatarp, this->mTexLayerSet, asset_id);
mUploadID = asset_id;
// upload the image
@@ -409,12 +414,10 @@ 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.
+ isAgentAvatarValid() &&
+ !gAgentAvatarp->isDead() &&
+ baked_upload_data->mAvatar == gAgentAvatarp && // Sanity check: only the user's avatar should be uploading textures.
baked_upload_data->mTexLayerSet->hasComposite()
)
{
@@ -439,11 +442,11 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
if (result >= 0)
{
- LLVOAvatarDefines::ETextureIndex baked_te = avatar->getBakedTE(layerset_buffer->mTexLayerSet);
+ 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 +460,7 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
llinfos << "Received baked texture out of date, ignored." << llendl;
}
- avatar->dirtyMesh();
+ gAgentAvatarp->dirtyMesh();
}
else
{
@@ -1846,7 +1849,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++)
diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h
index 5be58f64a9..ae280dd063 100644
--- a/indra/newview/lltexlayer.h
+++ b/indra/newview/lltexlayer.h
@@ -325,6 +325,7 @@ 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();
diff --git a/indra/newview/lltexlayerparams.cpp b/indra/newview/lltexlayerparams.cpp
index d55468841d..35acf883c7 100644
--- a/indra/newview/lltexlayerparams.cpp
+++ b/indra/newview/lltexlayerparams.cpp
@@ -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/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 49770030c6..9ad2322765 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -401,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...
@@ -410,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;
@@ -531,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;
}
@@ -547,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
@@ -564,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
@@ -630,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);
@@ -648,10 +652,7 @@ bool LLTextureCacheRemoteWorker::doWrite()
done = true;
}
}
- else
- {
- mDataSize = 0; // no data written
- }
+
// Nothing else to do at that point...
done = true;
}
@@ -742,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)
{
@@ -825,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)
{
@@ -934,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);
}
@@ -952,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));
@@ -973,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;
@@ -981,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++)
{
@@ -991,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
}
@@ -1002,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;
}
@@ -1022,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()
@@ -1034,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;
@@ -1075,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;
}
}
@@ -1086,22 +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();
-
- //the new entry, write immediately.
- // 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 ;
}
}
}
@@ -1117,40 +1097,130 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create
}
else
{
- 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();
+ 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 ;
}
- llassert_always(entry.mImageSize == 0 || entry.mImageSize == -1 || entry.mImageSize > entry.mBodySize);
}
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;
- }
- else if(mTexturesSizeMap.find(entry.mID) != mTexturesSizeMap.end() && mTexturesSizeMap[entry.mID] > 0)
- {
- llerrs << "mTexturesSizeMap / mHeaderIDMap corrupted." << llendl ;
- }
-// llinfos << "Updating TE: " << idx << ": " << id << " Size: " << entry.mBodySize << " Time: " << entry.mTime << llendl;
- mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, idx);
+ 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)
{
U32 num_entries = mHeaderEntriesInfo.mEntries;
@@ -1160,8 +1230,17 @@ U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries)
mFreeList.clear();
mTexturesSizeTotal = 0;
- LLAPRFile* aprfile = openHeaderEntriesFile(false, (S32)sizeof(EntriesInfo));
- updatedHeaderEntriesFile() ;
+ 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;
@@ -1175,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();
@@ -1207,7 +1282,6 @@ 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();
}
}
@@ -1280,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;
@@ -1298,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);
}
}
}
@@ -1315,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);
@@ -1332,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;
@@ -1343,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
@@ -1356,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
@@ -1370,7 +1434,7 @@ void LLTextureCache::readHeaderCache()
}
else
{
- writeEntriesAndClose(entries);
+ //entries are not changed, nothing here.
}
}
}
@@ -1398,8 +1462,9 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
}
if (purge_directories)
{
+ gDirUtilp->deleteFilesInDir(mTexturesDirName, mask);
LLFile::rmdir(mTexturesDirName);
- }
+ }
}
mHeaderIDMap.clear();
mTexturesSizeMap.clear();
@@ -1435,7 +1500,6 @@ void LLTextureCache::purgeTextures(bool validate)
U32 num_entries = openAndReadEntries(entries);
if (!num_entries)
{
- writeEntriesAndClose(entries);
return; // nothing to purge
}
@@ -1509,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);
}
}
@@ -1560,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;
}
@@ -1722,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 b840619c1f..0fceee3011 100644
--- a/indra/newview/lltexturecache.h
+++ b/indra/newview/lltexturecache.h
@@ -110,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);
@@ -123,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);
@@ -143,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);
@@ -161,12 +161,16 @@ 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(); }
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 2b846d33fc..efdddd947b 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);
+ }
+
+ // Show more detailed information if this agent is god.
+ if (gAgent.isGodlike())
+ {
+ 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 837f837430..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; }
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index b1b3ae473c..7fa04ce574 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -166,9 +166,10 @@ public:
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);
@@ -215,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;
@@ -242,15 +250,16 @@ 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 ;
S32 mHTTPFailCount;
S32 mRetryAttempt;
S32 mActiveCount;
@@ -292,7 +301,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();
@@ -374,6 +386,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
S32 size) // Desired size
: LLWorkerClass(fetcher, "TextureFetch"),
mState(INIT),
+ mWriteToCacheState(NOT_WRITE),
mFetcher(fetcher),
mID(id),
mHost(host),
@@ -402,6 +415,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
mNeedsAux(FALSE),
mHaveAllData(FALSE),
mInLocalCache(FALSE),
+ mCanUseHTTP(true),
mHTTPFailCount(0),
mRetryAttempt(0),
mActiveCount(0),
@@ -571,7 +585,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
if ((mFetcher->isQuitting() || mImagePriority < 1.0f || getFlags(LLWorkerClass::WCF_DELETE_REQUESTED)))
{
- if (mState < WRITE_TO_CACHE)
+ if (mState < DECODE_IMAGE)
{
return true; // abort
}
@@ -592,7 +606,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
if (mState == INIT)
- {
+ {
mRawImage = NULL ;
mRequestedDiscard = -1;
mLoadedDiscard = -1;
@@ -631,23 +645,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))
{
@@ -656,8 +674,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;
}
}
@@ -691,6 +712,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;
@@ -715,10 +737,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)
@@ -732,6 +754,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
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
@@ -740,16 +763,21 @@ bool LLTextureFetchWorker::doWork(S32 param)
//llwarns << "Region not found for host: " << mHost << llendl;
}
}
- 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)
{
// 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;
@@ -786,6 +814,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
mState = DECODE_IMAGE;
+ mWriteToCacheState = SHOULD_WRITE ;
}
else
{
@@ -875,7 +904,13 @@ 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;
+ //llinfos << "Texture missing from server (404): " << mUrl << llendl;
+
+ //roll back to try UDP
+ mState = INIT ;
+ mCanUseHTTP = false ;
+ setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
+ return false ;
}
else if (mGetStatus == HTTP_SERVICE_UNAVAILABLE)
{
@@ -929,10 +964,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)
{
@@ -947,6 +987,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;
}
@@ -1046,7 +1090,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 +1098,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;
@@ -1435,7 +1490,7 @@ LLTextureFetch::~LLTextureFetch()
}
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)
{
@@ -1497,6 +1552,7 @@ bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, con
worker->mNeedsAux = needs_aux;
worker->setImagePriority(priority);
worker->setDesiredDiscard(desired_discard, desired_size);
+ worker->setCanUseHTTP(can_use_http) ;
if (!worker->haveWork())
{
worker->mState = LLTextureFetchWorker::INIT;
@@ -1519,6 +1575,7 @@ bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, con
worker->lockWorkMutex();
worker->mActiveCount++;
worker->mNeedsAux = needs_aux;
+ worker->setCanUseHTTP(can_use_http) ;
worker->unlockWorkMutex();
}
@@ -1717,7 +1774,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);
@@ -1923,7 +1981,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);
@@ -2144,7 +2204,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);
@@ -2173,7 +2236,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;
@@ -2211,6 +2274,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 ef2ec520bf..634e590fe0 100644
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -62,7 +62,7 @@ public:
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);
@@ -77,7 +77,7 @@ 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() ;
S32 getNumHTTPRequests() ;
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index 6cd8a78b25..43913f3632 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -660,8 +660,9 @@ struct compare_decode_pair
struct KillView
{
- void operator()(LLView* viewp) const
+ void operator()(LLView* viewp)
{
+ viewp->getParent()->removeChild(viewp);
viewp->die();
}
};
@@ -676,8 +677,12 @@ void LLTextureView::draw()
for_each(mTextureBars.begin(), mTextureBars.end(), KillView());
mTextureBars.clear();
- delete mGLTexMemBar;
- mGLTexMemBar = 0;
+ if (mGLTexMemBar)
+ {
+ removeChild(mGLTexMemBar);
+ mGLTexMemBar->die();
+ mGLTexMemBar = 0;
+ }
typedef std::multiset<decode_pair_t, compare_decode_pair > display_list_t;
display_list_t display_image_list;
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 60a89c02e4..568cd4cb19 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),
@@ -71,6 +81,8 @@ LLToast::LLToast(const LLToast::Params& p)
mIsTip(p.is_tip),
mWrapperPanel(NULL)
{
+ mTimer.reset(new LLToastLifeTimer(this, p.lifetime_secs));
+
LLUICtrlFactory::getInstance()->buildFloater(this, "panel_toast.xml", NULL);
setCanDrag(FALSE);
@@ -105,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)
@@ -145,38 +137,10 @@ LLToast::~LLToast()
}
//--------------------------------------------------------------------------
-void LLToast::setAndStartTimer(F32 period)
-{
- if(mCanFade)
- {
- mToastLifetime = period;
- mTimer.start();
- }
-}
-
-//--------------------------------------------------------------------------
-bool LLToast::lifetimeHasExpired()
-{
- if (mTimer.getStarted())
- {
- F32 elapsed_time = mTimer.getElapsedTimeF32();
- if ((mToastLifetime - elapsed_time) <= mToastFadingTime)
- {
- setBackgroundOpaque(FALSE);
- }
- if (elapsed_time > mToastLifetime)
- {
- return true;
- }
- }
- return false;
-}
-
-//--------------------------------------------------------------------------
void LLToast::hide()
{
setVisible(FALSE);
- mTimer.stop();
+ mTimer->stop();
mIsHidden = true;
mOnFadeSignal(this);
}
@@ -222,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();
@@ -263,11 +228,6 @@ void LLToast::insertPanel(LLPanel* panel)
//--------------------------------------------------------------------------
void LLToast::draw()
{
- if(lifetimeHasExpired())
- {
- tick();
- }
-
LLFloater::draw();
if(!isBackgroundVisible())
@@ -282,6 +242,13 @@ void LLToast::draw()
drawChild(mHideBtn);
}
}
+
+ // if timer started and remaining time <= fading time
+ if (mTimer->getStarted() && (mToastLifetime
+ - mTimer->getEventTimer().getElapsedTimeF32()) <= mToastFadingTime)
+ {
+ setBackgroundOpaque(FALSE);
+ }
}
//--------------------------------------------------------------------------
@@ -300,12 +267,18 @@ void LLToast::setVisible(BOOL show)
if(show)
{
setBackgroundOpaque(TRUE);
- if(!mTimer.getStarted() && mCanFade)
+ if(!mTimer->getStarted() && mCanFade)
{
- mTimer.start();
+ mTimer->start();
}
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)
{
@@ -436,4 +409,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 64855020a9..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;
@@ -107,12 +129,12 @@ 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();
//
@@ -168,18 +190,15 @@ public:
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 onToastMouseEnter();
void onToastMouseLeave();
- void handleTipToastClick(S32 x, S32 y, MASK mask);
-
- // check timer
- bool lifetimeHasExpired();
- // on timer finished function
- void tick();
+ void expire();
LLUUID mNotificationID;
LLUUID mSessionID;
@@ -188,13 +207,13 @@ private:
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;
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index c3ccb9380b..6c6eda2e68 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;
@@ -279,10 +281,18 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
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);
+ // 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);
@@ -315,6 +325,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 +381,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/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index e6d13a7613..38f67720b7 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -44,6 +44,8 @@
#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
@@ -53,6 +55,8 @@ S32 BUTTON_WIDTH = 90;
const LLFontGL* LLToastNotifyPanel::sFont = NULL;
const LLFontGL* LLToastNotifyPanel::sFontSmall = NULL;
+LLToastNotifyPanel::button_click_signal_t LLToastNotifyPanel::sButtonClickSignal;
+
LLToastNotifyPanel::LLToastNotifyPanel(LLNotificationPtr& notification, const LLRect& rect) :
LLToastPanel(notification),
mTextBox(NULL),
@@ -60,7 +64,8 @@ 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)
@@ -193,11 +198,25 @@ mAddedDefaultBtn(false)
// 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()
{
@@ -265,10 +284,17 @@ 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);
+ }
}
}
@@ -342,6 +368,104 @@ void LLToastNotifyPanel::adjustPanelForTipNotice()
}
}
+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
void LLToastNotifyPanel::onClickButton(void* data)
{
@@ -354,8 +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);
- // disable all buttons
- self->mControlPanel->setEnabled(FALSE);
+ 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 152975e7de..a6644c0a7a 100644
--- a/indra/newview/lltoastnotifypanel.h
+++ b/indra/newview/lltoastnotifypanel.h
@@ -49,6 +49,9 @@ 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
{
@@ -60,11 +63,14 @@ public:
* @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);
@@ -76,7 +82,7 @@ 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);
@@ -90,6 +96,13 @@ private:
*/
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;
LLPanel* mInfoPanel; // a panel, that contains an information
@@ -98,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;
@@ -111,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/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..8a8bdd2dba 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 "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;
}
@@ -1908,14 +1445,14 @@ 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);
+ LLGiveInventory::doGiveInventoryItem(dest_agent, inv_item, session_id);
}
}
else
@@ -1931,13 +1468,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 +1513,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 +1521,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 +1570,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 +1597,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 +1605,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 +1632,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 +1674,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 +1682,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 +1703,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 +1711,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 +1741,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 +1749,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 +1782,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 +1796,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 +1814,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.
@@ -2301,7 +1835,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem(
return ACCEPT_NO;
}
- if(mSource == SOURCE_LIBRARY)
+ if (mSource == SOURCE_LIBRARY)
{
// create item based on that one, and put it on if that
// was a success.
@@ -2335,21 +1869,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 +1898,7 @@ EAcceptance LLToolDragAndDrop::dad3dActivateGesture(
}
else
{
- LLGestureManager::instance().activateGesture(item->getUUID());
+ LLGestureMgr::instance().activateGesture(item->getUUID());
gInventory.updateItem(item);
gInventory.notifyObservers();
}
@@ -2384,7 +1918,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 +1931,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 +1969,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 +1977,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 +1989,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 +2033,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 +2062,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 +2095,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 +2103,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 +2130,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 +2166,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 +2188,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 +2209,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 +2230,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 +2239,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 +2267,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 +2306,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 +2333,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 +2357,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 +2374,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 +2392,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 +2424,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..18334b5ee1 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,13 +243,6 @@ 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,
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..cae5e93545 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 );
}
@@ -890,9 +891,9 @@ void LLToolGrab::handleHoverInactive(S32 x, S32 y, MASK mask)
// Look for cursor against the edge of the screen
// Only works in fullscreen
- if (gSavedSettings.getBOOL("WindowFullScreen"))
+ if (gSavedSettings.getBOOL("FullScreen"))
{
- if (gAgent.cameraThirdPerson() )
+ if (gAgentCamera.cameraThirdPerson() )
{
if (x == 0)
{
@@ -994,7 +995,7 @@ void LLToolGrab::onMouseCaptureLost()
return;
}
// First, fix cursor placement
- if( !gAgent.cameraMouselook()
+ if( !gAgentCamera.cameraMouselook()
&& (GRAB_ACTIVE_CENTER == mMode))
{
if (objectp->isHUDAttachment())
@@ -1035,8 +1036,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 +1129,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 5f825b461e..c1dc1de5e5 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,6 +78,7 @@ LLVisualParamHint::LLVisualParamHint(
S32 width, S32 height,
LLViewerJointMesh *mesh,
LLViewerVisualParam *param,
+ LLWearable *wearable,
F32 param_weight)
:
LLViewerDynamicTexture(width, height, 3, LLViewerDynamicTexture::ORDER_MIDDLE, TRUE ),
@@ -86,6 +86,7 @@ LLVisualParamHint::LLVisualParamHint(
mIsVisible( FALSE ),
mJointMesh( mesh ),
mVisualParam( param ),
+ mWearablePtr( wearable ),
mVisualParamWeight( param_weight ),
mAllowsUpdates( TRUE ),
mDelayFrames( 0 ),
@@ -108,6 +109,12 @@ LLVisualParamHint::~LLVisualParamHint()
LLVisualParamHint::sInstances.erase( this );
}
+//virtual
+S8 LLVisualParamHint::getType() const
+{
+ return LLViewerDynamicTexture::LL_VISUAL_PARAM_HINT ;
+}
+
//-----------------------------------------------------------------------------
// static
// requestHintUpdates()
@@ -139,22 +146,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,7 +170,6 @@ void LLVisualParamHint::preRender(BOOL clear_depth)
BOOL LLVisualParamHint::render()
{
LLVisualParamReset::sDirty = TRUE;
- LLVOAvatar* avatarp = gAgent.getAvatarObject();
gGL.pushUIMatrix();
gGL.loadUIIdentity();
@@ -196,7 +200,7 @@ BOOL LLVisualParamHint::render()
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 );
+ cam_target_joint = (LLViewerJointMesh*)gAgentAvatarp->getJoint( cam_target_mesh_name );
}
if( !cam_target_joint )
{
@@ -204,11 +208,11 @@ BOOL LLVisualParamHint::render()
}
if( !cam_target_joint )
{
- cam_target_joint = (LLViewerJointMesh*)avatarp->getJoint("mHead");
+ cam_target_joint = (LLViewerJointMesh*)gAgentAvatarp->getJoint("mHead");
}
LLQuaternion avatar_rotation;
- LLJoint* root_joint = avatarp->getRootJoint();
+ LLJoint* root_joint = gAgentAvatarp->getRootJoint();
if( root_joint )
{
avatar_rotation = root_joint->getWorldRotation();
@@ -236,21 +240,23 @@ BOOL LLVisualParamHint::render()
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;
}
@@ -290,6 +296,12 @@ LLVisualParamReset::LLVisualParamReset() : LLViewerDynamicTexture(1, 1, 1, ORDER
{
}
+//virtual
+S8 LLVisualParamReset::getType() const
+{
+ return LLViewerDynamicTexture::LL_VISUAL_PARAM_RESET ;
+}
+
//-----------------------------------------------------------------------------
// render()
//-----------------------------------------------------------------------------
@@ -297,10 +309,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..3bffefaa55 100644
--- a/indra/newview/lltoolmorph.h
+++ b/indra/newview/lltoolmorph.h
@@ -62,8 +62,11 @@ public:
S32 width, S32 height,
LLViewerJointMesh *mesh,
LLViewerVisualParam *param,
+ LLWearable *wearable,
F32 param_weight);
+ /*virtual*/ S8 getType() const ;
+
BOOL needsRender();
void preRender(BOOL clear_depth);
BOOL render();
@@ -87,6 +90,7 @@ 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
@@ -107,6 +111,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 2f4a69a53c..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);
}
@@ -964,7 +969,7 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
}
}
}
-
+
// 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
@@ -972,9 +977,9 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
bool needs_tip = (!is_media_displaying ||
for_sale) &&
- (has_media ||
- needs_tooltip(nodep) ||
- needs_tooltip(LLSelectMgr::getInstance()->getPrimaryHoverNode()));
+ (has_media ||
+ needs_tooltip(nodep) ||
+ needs_tooltip(LLSelectMgr::getInstance()->getPrimaryHoverNode()));
if (show_all_object_tips || needs_tip)
{
@@ -1262,6 +1267,7 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick)
if (!parcel ||
objectp.isNull() ||
+ objectp->isHUDAttachment() ||
pick.mObjectFace < 0 ||
pick.mObjectFace >= objectp->getNumTEs())
{
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/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 b88069cd48..9efa6c4108 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,81 +165,72 @@ 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;
- }
-
- std::string sim_string = LLSLURL::stripProtocol(url);
- std::string region_name;
- S32 x = 128;
- S32 y = 128;
- S32 z = 0;
- if (! LLURLSimString::parse(sim_string, &region_name, &x, &y, &z))
- {
- 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;
}
// 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,
- LLURLDispatcherImpl::regionNameCallback,
- url,
- false); // don't teleport
+ LLWorldMapMessage::getInstance()->sendNamedRegionRequest(slurl.getRegion(),
+ LLURLDispatcherImpl::regionNameCallback,
+ 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;
-
- if (LLURLSimString::parse(sim_string, &region_name, &x, &y, &z))
- {
- regionHandleCallback(region_handle, url, snapshot_id, teleport);
- }
+
+ if(slurl.getType() == LLSLURL::LOCATION)
+ {
+ regionHandleCallback(region_handle, slurl, snapshot_id, teleport);
+ }
}
/* static */
-void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)
+void LLURLDispatcherImpl::regionHandleCallback(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;
+ // we can't teleport cross grid at this point
+ if((!LLGridManager::getInstance()->isSystemGrid(slurl.getGrid()) || !LLGridManager::getInstance()->isSystemGrid()) &&
+ (slurl.getGrid() != LLGridManager::getInstance()->getGrid()))
+ {
+ LLSD args;
+ args["SLURL"] = slurl.getLocationString();
+ args["CURRENT_GRID"] = LLGridManager::getInstance()->getGridLabel();
+ LLSD grid_info = LLGridManager::getInstance()->getGridInfo(slurl.getGrid());
+
+ 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;
+ }
+
LLVector3d global_pos = from_region_handle(region_handle);
- global_pos += LLVector3d(local_pos);
+ global_pos += LLVector3d(slurl.getPosition());
if (teleport)
{
@@ -271,8 +254,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())
@@ -287,7 +270,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:
@@ -303,18 +286,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;
}
@@ -324,21 +310,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.
@@ -348,5 +334,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/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index 1d935f5ab8..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();
//
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index 0051f46716..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"
@@ -354,7 +355,7 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
}
else
{
- z_far = gAgent.mDrawDistance;
+ z_far = gAgentCamera.mDrawDistance;
}
}
else
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 5daea96123..f02e15706d 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,10 @@
#include "llvosurfacepatch.h"
#include "llvowlsky.h"
#include "llrender.h"
-#include "llbottomtray.h"
#include "llnavigationbar.h"
#include "llfloatertools.h"
#include "llpaneloutfitsinventory.h"
+#include "llpanellogin.h"
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
BOOL gHackGodmode = FALSE;
@@ -102,7 +103,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 +412,7 @@ bool handleHighResSnapshotChanged(const LLSD& newvalue)
bool handleVoiceClientPrefsChanged(const LLSD& newvalue)
{
- if(gVoiceClient)
- {
- gVoiceClient->updateSettings();
- }
+ LLVoiceClient::getInstance()->updateSettings();
return true;
}
@@ -442,6 +440,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,30 +459,6 @@ 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)
-{
- LLBottomTray::getInstance()->showCameraButton(newvalue.asBoolean());
- return true;
-}
-
-bool toggle_show_snapshot_button(const LLSD& newvalue)
-{
- LLBottomTray::getInstance()->showSnapshotButton(newvalue.asBoolean());
- return true;
-}
-
bool toggle_show_navigation_panel(const LLSD& newvalue)
{
LLNavigationBar::getInstance()->showNavigationPanel(newvalue.asBoolean());
@@ -491,12 +471,6 @@ bool toggle_show_favorites_panel(const LLSD& newvalue)
return true;
}
-bool toggle_show_appearance_editor(const LLSD& newvalue)
-{
- LLPanelOutfitsInventory::sShowDebugEditor = newvalue.asBoolean();
- return true;
-}
-
bool toggle_show_object_render_cost(const LLSD& newvalue)
{
LLFloaterTools::sShowObjectCost = newvalue.asBoolean();
@@ -639,14 +613,10 @@ 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("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 6c1c1d1096..3482ac508e 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"
@@ -168,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;
}
@@ -344,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();
@@ -393,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:
@@ -731,6 +731,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();
@@ -920,9 +921,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())
{
@@ -1031,11 +1032,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);
@@ -1299,14 +1299,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 65e9d8971a..49ea0348f9 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,6 +49,7 @@
#include "llfloaterbuy.h"
#include "llfloaterbuycontents.h"
#include "llfloaterbuycurrency.h"
+#include "llfloaterbuycurrencyhtml.h"
#include "llfloaterbuyland.h"
#include "llfloaterbulkpermission.h"
#include "llfloaterbump.h"
@@ -135,7 +135,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>);
@@ -143,6 +142,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>);
@@ -151,7 +151,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>);
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 80336e5c5a..f8b6435614 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -36,14 +36,17 @@
#include "llnotificationsutil.h"
#include "llsdserialize.h"
#include "message.h"
-#include "indra_constants.h"
#include "llagent.h"
+#include "llagentcamera.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"
@@ -58,9 +61,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
@@ -101,7 +174,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");
@@ -261,10 +334,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
{
@@ -312,6 +389,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;
}
@@ -512,7 +601,7 @@ void LLViewerInventoryCategory::removeFromServer( void )
gAgent.sendReliableMessage();
}
-bool LLViewerInventoryCategory::fetchDescendents()
+bool LLViewerInventoryCategory::fetch()
{
if((VERSION_UNKNOWN == mVersion)
&& mDescendentsRequested.hasExpired()) //Expired check prevents multiple downloads.
@@ -537,7 +626,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.
@@ -674,8 +763,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;
@@ -790,13 +879,15 @@ void WearOnAvatarCallback::fire(const LLUUID& inv_item)
void ModifiedCOFCallback::fire(const LLUUID& inv_item)
{
- LLAppearanceManager::instance().updateAppearanceFromCOF();
- if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode() )
+ LLAppearanceMgr::instance().updateAppearanceFromCOF();
+ // 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();
}
}
}
@@ -826,7 +917,7 @@ void ActivateGestureCallback::fire(const LLUUID& inv_item)
if (inv_item.isNull())
return;
- LLGestureManager::instance().activateGesture(inv_item);
+ LLGestureMgr::instance().activateGesture(inv_item);
}
void CreateGestureCallback::fire(const LLUUID& inv_item)
@@ -834,7 +925,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;
@@ -859,10 +950,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);
@@ -876,7 +986,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();
@@ -919,6 +1029,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)
{
@@ -944,7 +1055,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))
{
@@ -975,7 +1085,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();
}
@@ -1071,7 +1181,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();
@@ -1095,7 +1205,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)
{
@@ -1127,10 +1237,10 @@ 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);
+ LLAssetType::EType asset_type = LLWearableType::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);
@@ -1140,7 +1250,7 @@ void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, co
llwarns << "Can't create unrecognized type " << type_name << llendl;
}
}
- folder->setNeedsAutoRename(TRUE);
+ root->setNeedsAutoRename(TRUE);
}
LLAssetType::EType LLViewerInventoryItem::getType() const
@@ -1468,14 +1578,14 @@ 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);
}
@@ -1581,6 +1691,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 3d3f80b9b5..8ab7c9710d 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -74,7 +74,7 @@ public:
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.
@@ -138,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;
@@ -159,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);
@@ -212,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
@@ -310,14 +311,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);
@@ -339,6 +340,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);
@@ -356,7 +358,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/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 85efe2724e..14e58f4167 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,6 +46,7 @@
#include "llviewertexturelist.h"
#include "llvovolume.h"
#include "llpluginclassmedia.h"
+#include "llplugincookiestore.h"
#include "llviewerwindow.h"
#include "llfocusmgr.h"
#include "llcallbacklist.h"
@@ -256,6 +258,43 @@ 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;
@@ -264,6 +303,8 @@ 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)
@@ -399,7 +440,6 @@ 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->isAutoPlayable())
{
needs_navigate = true;
@@ -693,11 +733,25 @@ 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();
@@ -982,6 +1036,337 @@ bool LLViewerMedia::isParcelAudioPlaying()
return (LLViewerMedia::hasParcelAudio() && gAudiop && LLAudioEngine::AUDIO_PLAYING == gAudiop->isInternetStreamPlaying());
}
+/////////////////////////////////////////////////////////////////////////////////////////
+// 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
+LLPluginCookieStore *LLViewerMedia::getCookieStore()
+{
+ if(sCookieStore == NULL)
+ {
+ sCookieStore = new LLPluginCookieStore;
+ }
+
+ return sCookieStore;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// 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)
+ {
+ pimpl->mMediaSource->clear_cookies();
+ }
+ }
+
+ // 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;
@@ -1119,11 +1504,6 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id,
//////////////////////////////////////////////////////////////////////////////////////////
LLViewerMediaImpl::~LLViewerMediaImpl()
{
- if( gEditMenuHandler == this )
- {
- gEditMenuHandler = NULL;
- }
-
destroyMediaSource();
LLViewerMediaTexture::removeMediaImplFromTexture(mTextureId) ;
@@ -1183,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;
+ }
}
}
@@ -1203,6 +1586,7 @@ void LLViewerMediaImpl::destroyMediaSource()
if(mMediaSource)
{
+ mMediaSource->setDeleteOK(true) ;
delete mMediaSource;
mMediaSource = NULL;
}
@@ -1258,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;
}
@@ -1319,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;
@@ -1511,7 +1923,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);
}
}
@@ -1842,7 +2275,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())
@@ -2022,6 +2455,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)
{
@@ -2363,6 +2808,33 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
}
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.
@@ -2484,6 +2956,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()
{
@@ -2571,8 +3050,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)
@@ -2849,8 +3337,9 @@ bool LLViewerMediaImpl::shouldShowBasedOnClass() const
// " outside = " << (!inside_parcel && gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING)) << llendl;
// If it has focus, we should show it
- if (hasFocus())
- return true;
+ // 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)
@@ -2895,7 +3384,7 @@ bool LLViewerMediaImpl::isObjectAttachedToAnotherAvatar(LLVOVolume *obj)
if (NULL != object)
{
LLVOAvatar *avatar = object->asAvatar();
- if (NULL != avatar && avatar != gAgent.getAvatarObject())
+ if ((NULL != avatar) && (avatar != gAgentAvatarp))
{
result = true;
break;
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index bc51e713a1..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 LLMimeDiscoveryResponder;
+class LLPluginCookieStore;
typedef LLPointer<LLViewerMediaImpl> viewer_media_t;
///////////////////////////////////////////////////////////////////////////////
@@ -133,8 +136,35 @@ public:
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
@@ -282,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();
@@ -400,6 +431,7 @@ private:
bool mIsParcelMedia;
S32 mProximity;
F64 mProximityDistance;
+ F64 mProximityCamera;
LLMimeDiscoveryResponder *mMimeTypeProbe;
bool mMediaAutoPlay;
std::string mMediaEntryURL;
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index b8179f7fc2..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"
@@ -201,7 +202,7 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal,
{
if (object)
{
- gAgent.setFocusOnAvatar(FALSE, ANIMATE);
+ gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
LLBBox bbox = object->getBoundingBoxAgent();
LLVector3d center = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent());
@@ -214,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
@@ -230,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;
@@ -260,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();
@@ -271,18 +278,18 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal,
// 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(gAgent.getCameraPositionGlobal(), target_pos) < dist_vec_squared(camera_pos, target_pos)))
+ (dist_vec_squared(gAgentCamera.getCameraPositionGlobal(), target_pos) < dist_vec_squared(camera_pos, target_pos)))
{
return;
}
- gAgent.setCameraPosAndFocusGlobal(camera_pos, target_pos, object->getID() );
+ 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()
@@ -439,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)
@@ -482,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;
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index bc3b8ac9d6..69352e6685 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -42,6 +42,7 @@
// newview includes
#include "llagent.h"
+#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llagentpilot.h"
#include "llbottomtray.h"
@@ -52,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"
@@ -72,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"
@@ -86,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()
@@ -103,6 +106,8 @@
#include "llfloatercamera.h"
#include "lluilistener.h"
#include "llappearancemgr.h"
+#include "lltrans.h"
+#include "lleconomy.h"
using namespace LLVOAvatarDefines;
@@ -132,6 +137,7 @@ extern BOOL gDebugWindowProc;
LLMenuBarGL *gMenuBarView = NULL;
LLViewerMenuHolderGL *gMenuHolder = NULL;
LLMenuGL *gPopupMenuView = NULL;
+LLMenuGL *gEditMenu = NULL;
LLMenuBarGL *gLoginMenuBarView = NULL;
// Pie menus
@@ -286,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*);
@@ -379,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>(
@@ -422,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" );
}
@@ -434,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
@@ -469,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);
@@ -1450,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;
}
@@ -1486,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;
@@ -1796,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;
}
};
@@ -2478,18 +2493,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();
}
@@ -2507,7 +2522,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();
@@ -2515,19 +2530,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();
}
}
@@ -2572,19 +2587,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();
}
@@ -2687,11 +2702,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;
@@ -2819,14 +2833,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
@@ -3272,7 +3286,9 @@ void handle_buy_object(LLSaleInfo sale_info)
if (price > 0 && price > gStatusBar->getBalance())
{
- LLFloaterBuyCurrency::buyCurrency("This object costs", price);
+ LLStringUtil::format_map_t args;
+ args["AMOUNT"] = llformat("%d", price);
+ LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("this_object_costs", args), price );
return;
}
@@ -3358,7 +3374,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;
}
@@ -3456,7 +3472,7 @@ void set_god_level(U8 god_level)
if(gViewerWindow)
{
gViewerWindow->setMenuBackgroundColor(god_level > GOD_NOT,
- LLViewerLogin::getInstance()->isInProductionGrid());
+ LLGridManager::getInstance()->isInProductionGrid());
}
LLSD args;
@@ -3496,7 +3512,7 @@ BOOL check_toggle_hacked_godmode(void*)
bool enable_toggle_hacked_godmode(void*)
{
- return !LLViewerLogin::getInstance()->isInProductionGrid();
+ return !LLGridManager::getInstance()->isInProductionGrid();
}
#endif
@@ -3617,6 +3633,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();
@@ -3687,9 +3711,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
{
@@ -3711,17 +3735,15 @@ void reset_view_final( BOOL proceed );
void handle_reset_view()
{
- if( (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode()) && gFloaterCustomize )
+ if (gAgentCamera.cameraCustomizeAvatar())
{
- // Show dialog box if needed.
- gFloaterCustomize->askToSaveIfDirty( reset_view_final );
- }
- else
- {
- 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
@@ -3741,15 +3763,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;
}
};
@@ -3758,13 +3780,13 @@ 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;
}
@@ -3774,7 +3796,9 @@ class LLViewFullscreen : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- gViewerWindow->toggleFullscreen(TRUE);
+ // we no longer permit full screen mode EXT-6775
+ // gViewerWindow->toggleFullscreen(TRUE);
+ llwarns << "full screen mode no longer supported" << llendl;
return true;
}
};
@@ -3852,15 +3876,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))
@@ -3983,9 +4007,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);
@@ -4367,7 +4391,7 @@ BOOL enable_take()
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!LLViewerLogin::getInstance()->isInProductionGrid()
+ if (!LLGridManager::getInstance()->isInProductionGrid()
&& gAgent.isGodlike())
{
return TRUE;
@@ -4402,8 +4426,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
@@ -4578,13 +4603,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
@@ -4982,7 +5003,7 @@ bool enable_object_delete()
TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- (!LLViewerLogin::getInstance()->isInProductionGrid()
+ (!LLGridManager::getInstance()->isInProductionGrid()
&& gAgent.isGodlike()) ||
# endif
LLSelectMgr::getInstance()->canDoDelete();
@@ -5026,7 +5047,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;
}
};
@@ -5140,7 +5161,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()
@@ -5177,10 +5198,6 @@ void toggle_debug_menus(void*)
{
BOOL visible = ! gSavedSettings.getBOOL("UseDebugMenus");
gSavedSettings.setBOOL("UseDebugMenus", visible);
- if(visible)
- {
- //LLFirstUse::useDebugMenus();
- }
show_debug_menus();
}
@@ -5325,13 +5342,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 = 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());
@@ -5348,17 +5375,17 @@ void handle_look_at_selection(const LLSD& param)
if (zoom)
{
// Make sure we are not increasing the distance between the camera and object
- LLVector3d orig_distance = gAgent.getCameraPositionGlobal() - LLSelectMgr::getInstance()->getSelectionCenterGlobal();
+ LLVector3d orig_distance = gAgentCamera.getCameraPositionGlobal() - LLSelectMgr::getInstance()->getSelectionCenterGlobal();
distance = llmin(distance, (F32) orig_distance.length());
- gAgent.setCameraPosAndFocusGlobal(LLSelectMgr::getInstance()->getSelectionCenterGlobal() + LLVector3d(obj_to_cam * distance),
+ 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 +5398,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 +5410,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 );
}
@@ -5579,10 +5606,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()
@@ -5594,7 +5628,7 @@ void handle_report_abuse()
void handle_buy_currency()
{
- LLFloaterBuyCurrency::buyCurrency();
+ LLBuyCurrencyHTML::openCurrencyFloater();
}
class LLFloaterVisible : public view_listener_t
@@ -5767,18 +5801,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();
}
@@ -5837,7 +5871,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;
@@ -5858,8 +5892,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)
{
@@ -5904,7 +5938,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();
}
}
}
@@ -5984,7 +6018,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");
@@ -6012,7 +6046,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();
@@ -6090,10 +6124,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:
@@ -6130,7 +6166,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)
{
@@ -6147,13 +6183,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);
}
}
}
@@ -6262,8 +6294,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;
}
@@ -6459,13 +6491,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 );
}
@@ -6480,15 +6512,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;
@@ -6627,7 +6654,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
{
@@ -6689,7 +6716,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;
@@ -6750,7 +6777,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;
}
};
@@ -6908,7 +6935,7 @@ void reload_vertex_shader(void *)
void handle_dump_avatar_local_textures(void*)
{
- gAgent.getAvatarObject()->dumpLocalTextures();
+ gAgentAvatarp->dumpLocalTextures();
}
void handle_dump_timers()
@@ -6925,89 +6952,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;
}
@@ -7046,7 +7062,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 *)
@@ -7218,12 +7234,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)
@@ -7467,8 +7482,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;
}
@@ -7483,8 +7498,8 @@ 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)
{
// MULTI-WEARABLES
LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(gAgentWearables.getWearableInventoryItem(type,0));
@@ -7641,6 +7656,42 @@ class LLWorldToggleCameraControls : public view_listener_t
}
};
+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",
@@ -7682,6 +7733,8 @@ void initialize_menus()
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));
enable.add("Agent.enableFlying", boost::bind(&LLAgent::enableFlying));
@@ -7712,7 +7765,10 @@ void initialize_menus()
view_listener_t::addMenu(new LLEditEnableDuplicate(), "Edit.EnableDuplicate");
view_listener_t::addMenu(new LLEditEnableTakeOff(), "Edit.EnableTakeOff");
view_listener_t::addMenu(new LLEditEnableCustomizeAvatar(), "Edit.EnableCustomizeAvatar");
+ 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");
@@ -7743,6 +7799,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");
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index d3c34f0de4..d72ea00077 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -157,6 +157,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 84b270f8cc..5570fe5fec 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:
@@ -317,13 +318,11 @@ class LLFileUploadBulk : public view_listener_t
LLStringUtil::trim(asset_name);
std::string display_name = LLStringUtil::null;
- LLAssetStorage::LLStoreAssetCallback callback = NULL;
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
- void *userdata = NULL;
- upload_new_resource(filename, asset_name, asset_name, 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
+ upload_new_resource(filename, asset_name, asset_name, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
display_name,
- callback, expected_upload_cost, userdata);
+ NULL, expected_upload_cost);
// *NOTE: Ew, we don't iterate over the file list here,
// we handle the next files in upload_done_callback()
@@ -411,7 +410,6 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
{
gViewerWindow->playSnapshotAnimAndSound();
- LLImageBase::setSizeOverride(TRUE);
LLPointer<LLImageFormatted> formatted;
switch(LLFloaterSnapshot::ESnapshotFormat(gSavedSettings.getS32("SnapshotFormat")))
{
@@ -426,12 +424,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;
@@ -480,16 +478,15 @@ void handle_compress_image(void*)
}
void upload_new_resource(const std::string& src_filename, std::string name,
- std::string desc, S32 compression_info,
+ std::string desc,
LLFolderType::EType destination_folder_type,
LLInventoryType::EType inv_type,
U32 next_owner_perms,
U32 group_perms,
U32 everyone_perms,
const std::string& display_name,
- LLAssetStorage::LLStoreAssetCallback callback,
- S32 expected_upload_cost,
- void *userdata)
+ boost::function<void(const LLUUID& uuid)> callback,
+ S32 expected_upload_cost)
{
// Generate the temporary UUID.
std::string filename = gDirUtilp->getTempFilename();
@@ -771,9 +768,9 @@ void upload_new_resource(const std::string& src_filename, std::string name,
{
t_disp_name = src_filename;
}
- upload_new_resource(tid, asset_type, name, desc, compression_info, // tid
+ upload_new_resource(tid, asset_type, name, desc,
destination_folder_type, inv_type, next_owner_perms, group_perms, everyone_perms,
- display_name, callback, expected_upload_cost, userdata);
+ display_name, callback, expected_upload_cost);
}
else
{
@@ -811,10 +808,10 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt
if(!(can_afford_transaction(expected_upload_cost)))
{
- LLFloaterBuyCurrency::buyCurrency(
- llformat(LLTrans::getString("UploadingCosts").c_str(),
- data->mAssetInfo.getName().c_str()),
- 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)
@@ -892,30 +889,28 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt
LLStringUtil::trim(asset_name);
std::string display_name = LLStringUtil::null;
- LLAssetStorage::LLStoreAssetCallback callback = NULL;
- void *userdata = NULL;
upload_new_resource(next_file, asset_name, asset_name, // file
- 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
+ LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
PERM_NONE, PERM_NONE, PERM_NONE,
display_name,
- callback,
- expected_upload_cost, // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost
- userdata);
+ NULL,
+ expected_upload_cost); // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost
+
}
}
-void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type,
+void upload_new_resource(const LLTransactionID &tid,
+ LLAssetType::EType asset_type,
std::string name,
- std::string desc, S32 compression_info,
+ std::string desc,
LLFolderType::EType destination_folder_type,
LLInventoryType::EType inv_type,
U32 next_owner_perms,
U32 group_perms,
U32 everyone_perms,
const std::string& display_name,
- LLAssetStorage::LLStoreAssetCallback callback,
- S32 expected_upload_cost,
- void *userdata)
+ boost::function<void(const LLUUID& uuid)> callback,
+ S32 expected_upload_cost)
{
if(gDisconnected)
{
@@ -959,76 +954,26 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty
upload_message.append(display_name);
LLUploadDialog::modalUploadDialog(upload_message);
- llinfos << "*** Uploading: " << llendl;
- llinfos << "Type: " << LLAssetType::lookup(asset_type) << llendl;
- llinfos << "UUID: " << uuid << llendl;
- llinfos << "Name: " << name << llendl;
- llinfos << "Desc: " << desc << llendl;
- llinfos << "Expected Upload Cost: " << expected_upload_cost << llendl;
- lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type) << llendl;
- lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl;
std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory");
- if (!url.empty())
- {
- llinfos << "New Agent Inventory via capability" << llendl;
- LLSD body;
- body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type);
- body["asset_type"] = LLAssetType::lookup(asset_type);
- body["inventory_type"] = LLInventoryType::lookup(inv_type);
- body["name"] = name;
- body["description"] = desc;
- body["next_owner_mask"] = LLSD::Integer(next_owner_perms);
- body["group_mask"] = LLSD::Integer(group_perms);
- body["everyone_mask"] = LLSD::Integer(everyone_perms);
- body["expected_upload_cost"] = LLSD::Integer(expected_upload_cost);
-
- //std::ostringstream llsdxml;
- //LLSDSerialize::toPrettyXML(body, llsdxml);
- //llinfos << "posting body to capability: " << llsdxml.str() << llendl;
-
- LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, uuid, asset_type));
+
+ if (url.empty()) {
+ llwarns << "Could not get NewFileAgentInventory capability" << llendl;
+ return;
}
- else
- {
- llinfos << "NewAgentInventory capability not found, new agent inventory via asset system." << llendl;
- // check for adequate funds
- // TODO: do this check on the sim
- if (LLAssetType::AT_SOUND == asset_type ||
- LLAssetType::AT_TEXTURE == asset_type ||
- LLAssetType::AT_ANIMATION == asset_type)
- {
- S32 balance = gStatusBar->getBalance();
- if (balance < expected_upload_cost)
- {
- // insufficient funds, bail on this upload
- LLFloaterBuyCurrency::buyCurrency("Uploading costs", expected_upload_cost);
- return;
- }
- }
- LLResourceData* data = new LLResourceData;
- data->mAssetInfo.mTransactionID = tid;
- data->mAssetInfo.mUuid = uuid;
- data->mAssetInfo.mType = asset_type;
- data->mAssetInfo.mCreatorID = gAgentID;
- data->mInventoryType = inv_type;
- data->mNextOwnerPerm = next_owner_perms;
- data->mExpectedUploadCost = expected_upload_cost;
- data->mUserData = userdata;
- data->mAssetInfo.setName(name);
- data->mAssetInfo.setDescription(desc);
- data->mPreferredLocation = destination_folder_type;
-
- LLAssetStorage::LLStoreAssetCallback asset_callback = &upload_done_callback;
- if (callback)
- {
- asset_callback = callback;
- }
- gAssetStorage->storeAssetData(data->mAssetInfo.mTransactionID, data->mAssetInfo.mType,
- asset_callback,
- (void*)data,
- FALSE);
- }
+ llinfos << "New Agent Inventory via capability" << llendl;
+ LLSD body;
+ body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type);
+ body["asset_type"] = LLAssetType::lookup(asset_type);
+ body["inventory_type"] = LLInventoryType::lookup(inv_type);
+ body["name"] = name;
+ body["description"] = desc;
+ body["next_owner_mask"] = LLSD::Integer(next_owner_perms);
+ body["group_mask"] = LLSD::Integer(group_perms);
+ body["everyone_mask"] = LLSD::Integer(everyone_perms);
+ body["expected_upload_cost"] = LLSD::Integer(expected_upload_cost);
+
+ LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, uuid, asset_type, callback));
}
void init_menu_file()
diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h
index 1e6d13f1c6..33f8243ac0 100644
--- a/indra/newview/llviewermenufile.h
+++ b/indra/newview/llviewermenufile.h
@@ -34,41 +34,35 @@
#define LLVIEWERMENUFILE_H
#include "llfoldertype.h"
-#include "llassetstorage.h"
#include "llinventorytype.h"
class LLTransactionID;
-
void init_menu_file();
void upload_new_resource(const std::string& src_filename,
std::string name,
std::string desc,
- S32 compression_info,
LLFolderType::EType destination_folder_type,
LLInventoryType::EType inv_type,
U32 next_owner_perms,
U32 group_perms,
U32 everyone_perms,
const std::string& display_name,
- LLAssetStorage::LLStoreAssetCallback callback,
- S32 expected_upload_cost,
- void *userdata);
+ boost::function<void(const LLUUID& uuid)> callback,
+ S32 expected_upload_cost);
void upload_new_resource(const LLTransactionID &tid,
LLAssetType::EType type,
std::string name,
std::string desc,
- S32 compression_info,
LLFolderType::EType destination_folder_type,
LLInventoryType::EType inv_type,
U32 next_owner_perms,
U32 group_perms,
U32 everyone_perms,
const std::string& display_name,
- LLAssetStorage::LLStoreAssetCallback callback,
- S32 expected_upload_cost,
- void *userdata);
+ boost::function<void(const LLUUID& uuid)> callback,
+ S32 expected_upload_cost);
#endif
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 361f4e2326..5836aff4e7 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -32,6 +32,7 @@
#include "llviewerprecompiledheaders.h"
#include "llviewermessage.h"
+#include "boost/lexical_cast.hpp"
#include "llanimationstates.h"
#include "llaudioengine.h"
@@ -41,6 +42,7 @@
#include "lleventtimer.h"
#include "llfloaterreg.h"
#include "llfollowcamparams.h"
+#include "llinventorydefines.h"
#include "llregionhandle.h"
#include "llsdserialize.h"
#include "llteleportflags.h"
@@ -51,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"
@@ -62,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"
@@ -105,6 +107,7 @@
#include "llpanelplaceprofile.h"
#include <boost/algorithm/string/split.hpp> //
+#include <boost/regex.hpp>
#if LL_WINDOWS // For Windows specific error handler
#include "llwindebug.h" // For the invalid message handler
@@ -112,6 +115,11 @@
#include "llnotificationmanager.h" //
+#if LL_MSVC
+// disable boost::lexical_cast warning
+#pragma warning (disable:4702)
+#endif
+
//
// Constants
//
@@ -272,7 +280,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 );
}
}
@@ -686,6 +696,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_item(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);
@@ -694,10 +750,13 @@ 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 done()
{
open_inventory_offer(mComplete, mFromName);
@@ -708,6 +767,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
@@ -718,6 +881,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();
}
@@ -746,13 +936,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() {}
@@ -835,21 +1033,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);
@@ -866,9 +1069,9 @@ 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& items, const std::string& from_name)
{
- 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)
{
@@ -886,7 +1089,7 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f
////////////////////////////////////////////////////////////////////////////////
// Special handling for various types.
- const LLAssetType::EType asset_type = item->getType();
+ const LLAssetType::EType asset_type = item->getActualType();
if (check_offer_throttle(from_name, false)) // If we are throttled, don't display
{
LL_DEBUGS("Messaging") << "Highlighting inventory item: " << item->getUUID() << LL_ENDL;
@@ -910,9 +1113,12 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f
}
else if("group_offer" == from_name)
{
- // do not open inventory when we open group notice attachment because
- // we already opened landmark info panel
// "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"] = item_id;
+ LLSideTray::getInstance()->showPanel("panel_places", args);
continue;
}
@@ -923,28 +1129,6 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f
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)
- {
- // 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);
- //}
- //else
- // we are opening a group notice attachment
- if("create_landmark" != places_panel->getPlaceInfoType())
- {
- LLSD args;
- args["type"] = "landmark";
- args["id"] = item_id;
- LLSideTray::getInstance()->showPanel("panel_places", args);
- }
- }
}
}
break;
@@ -1051,7 +1235,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);
@@ -1066,6 +1249,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();
@@ -1079,6 +1272,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()
@@ -1095,9 +1305,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;
@@ -1137,6 +1353,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;
@@ -1183,11 +1414,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();
}
@@ -1244,13 +1473,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();
}
@@ -1279,7 +1504,10 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
gInventory.addObserver(opener);
}
- delete this;
+ if(!mPersist)
+ {
+ delete this;
+ }
return false;
}
@@ -1445,10 +1673,34 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
gInventory.addObserver(opener);
}
- 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
@@ -1500,7 +1752,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
{
@@ -1513,30 +1767,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;
@@ -1551,9 +1781,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");
@@ -1563,23 +1793,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();
}
@@ -1594,7 +1828,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));
+ p.payload = payload;
+ LLPostponedNotification::add<LLPostponedOfferNotification>(p, info->mFromID, false);
}
}
}
@@ -1659,6 +1894,76 @@ 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;
+}
+
void process_improved_im(LLMessageSystem *msg, void **user_data)
{
if (gNoRender)
@@ -1728,17 +2033,15 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
std::string separator_string(": ");
LLSD args;
+ LLSD payload;
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;
-
- // Note: don't put the message in the IM history, even though was sent
- // via the IM mechanism.
- LLNotificationsUtil::add("SystemMessageTip",args);
+ payload["SESSION_NAME"] = name;
+ payload["from_id"] = from_id;
+ LLNotificationsUtil::add("IMSystemMessageTip",args, payload);
break;
case IM_NOTHING_SPECIAL:
@@ -1961,7 +2264,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;
@@ -2024,7 +2326,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;
@@ -2085,10 +2388,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
@@ -2194,10 +2495,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;
@@ -2209,20 +2513,16 @@ 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;
args["type"] = LLNotificationsUI::NT_NEARBYCHAT;
LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args);
@@ -2243,13 +2543,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:
@@ -2290,15 +2593,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;
@@ -2358,7 +2680,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
@@ -2367,7 +2689,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);
}
}
}
@@ -2727,7 +3052,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);
}
@@ -2808,7 +3133,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);
@@ -2819,8 +3146,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(
@@ -2881,7 +3208,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);
@@ -2890,9 +3217,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();
}
@@ -2921,6 +3248,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
@@ -2966,18 +3296,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);
@@ -3056,8 +3386,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.
@@ -3078,7 +3407,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;
}
@@ -3101,9 +3430,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 );
@@ -3111,11 +3440,13 @@ 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)
- LLSD substitution = LLSD().with("[T_SLURL]", gAgent.getTeleportSourceSLURL());
+ 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);
@@ -3124,9 +3455,9 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
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
@@ -3152,7 +3483,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);
}
}
@@ -3186,9 +3517,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
@@ -3329,7 +3660,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();
@@ -3452,7 +3783,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);
@@ -4089,7 +4420,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 );
}
@@ -4104,7 +4435,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)
@@ -4137,20 +4468,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
}
@@ -4458,27 +4790,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);
}
@@ -4507,6 +4915,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;
@@ -5115,14 +5527,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();
@@ -5135,8 +5547,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)
@@ -5172,7 +5584,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)
{
@@ -5347,13 +5759,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);
@@ -5435,7 +5847,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)
@@ -5465,6 +5879,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;
@@ -5485,8 +5901,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();
@@ -5872,7 +6292,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);
@@ -6052,3 +6472,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..72ad3c8926 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);
-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..c76eee80f7 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,505 @@
#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
+//
+
-void LLViewerLogin::setGridChoice(EGridInfo grid)
-{
- if(grid < 0 || grid >= GRID_INFO_COUNT)
+//
+// 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);
+
+
+
+ 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())
+ {
+ 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())
+ {
+ 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_INFOS("GridManager") << "reading: " << key_name << LL_ENDL;
+ if (mGridList.has(key_name) &&
+ mGridList[key_name].has(GRID_IS_SYSTEM_GRID_VALUE))
+ {
+ LL_INFOS("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_INFOS("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())
{
- llerrs << "Invalid grid index specified." << llendl;
- return;
+ mGrid = getGridByLabel(cmd_line_grid);
}
+ LL_INFOS("GridManager") << "Grid Name: " << mGrid << LL_ENDL;
+
+ // If a command line login URI was passed in, so we should add the command
+ // line grid to the list of grids
- if(mGridChoice != grid || gSavedSettings.getS32("ServerChoice") != grid)
+ LLSD cmd_line_login_uri = gSavedSettings.getLLSD("CmdLineLoginURI");
+ if (cmd_line_login_uri.isString())
{
- mGridChoice = grid;
- if(GRID_INFO_LOCAL == mGridChoice)
+ LL_INFOS("GridManager") << "adding cmd line login uri" << LL_ENDL;
+ // grab the other related URI values
+ std::string cmd_line_helper_uri = gSavedSettings.getString("CmdLineHelperURI");
+ std::string cmd_line_login_page = gSavedSettings.getString("LoginPage");
+
+ // we've a cmd line login, so add a grid for the command line,
+ // overwriting any existing grids
+ LLSD grid = LLSD::emptyMap();
+ grid[GRID_LOGIN_URI_VALUE] = LLSD::emptyArray();
+ grid[GRID_LOGIN_URI_VALUE].append(cmd_line_login_uri);
+ LL_INFOS("GridManager") << "cmd line login uri: " << cmd_line_login_uri.asString() << LL_ENDL;
+ LLURI uri(cmd_line_login_uri.asString());
+ if (mGrid.empty())
{
- mGridName = LOOPBACK_ADDRESS_STRING;
+ // if a grid name was not passed in via the command line,
+ // then set the grid name based on the hostname of the
+ // login uri
+ mGrid = uri.hostName();
}
- else if(GRID_INFO_OTHER == mGridChoice)
+
+ grid[GRID_VALUE] = mGrid;
+
+ if (mGridList.has(mGrid) && mGridList[mGrid].has(GRID_LABEL_VALUE))
{
- // *FIX:Mani - could this possibly be valid?
- mGridName = "other";
+ grid[GRID_LABEL_VALUE] = mGridList[mGrid][GRID_LABEL_VALUE];
}
else
{
- mGridName = gGridInfo[mGridChoice].mLabel;
+ grid[GRID_LABEL_VALUE] = mGrid;
+ }
+ if(!cmd_line_helper_uri.empty())
+ {
+ grid[GRID_HELPER_URI_VALUE] = cmd_line_helper_uri;
+ }
+
+ if(!cmd_line_login_page.empty())
+ {
+ grid[GRID_LOGIN_PAGE_VALUE] = cmd_line_login_page;
}
+ // if the login page, helper URI value, and so on are not specified,
+ // add grid will generate them.
- gSavedSettings.setS32("ServerChoice", mGridChoice);
- gSavedSettings.setString("CustomServer", "");
+ // Also, we will override a system grid if values are passed in via the command
+ // line, for testing. These values will not be remembered though.
+ if (mGridList.has(mGrid) && mGridList[mGrid].has(GRID_IS_SYSTEM_GRID_VALUE))
+ {
+ grid[GRID_IS_SYSTEM_GRID_VALUE] = TRUE;
+ }
+ addGrid(grid);
}
-}
+
+ // if a grid was not passed in via the command line, grab it from the CurrentGrid setting.
+ if (mGrid.empty())
+ {
+
+ mGrid = gSavedSettings.getString("CurrentGrid");
+ }
+
+ if (mGrid.empty() || !mGridList.has(mGrid))
+ {
+ // the grid name was empty, or the grid isn't actually in the list, then set it to the
+ // appropriate default.
+ LL_INFOS("GridManager") << "Resetting grid as grid name " << mGrid << " is not in the list" << LL_ENDL;
+ mGrid = MAINGRID;
+ }
+ LL_INFOS("GridManager") << "Selected grid is " << mGrid << LL_ENDL;
+ gSavedSettings.setString("CurrentGrid", mGrid);
-void LLViewerLogin::setGridChoice(const std::string& grid_name)
-{
- // 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);
- }
- }
}
-void LLViewerLogin::resetURIs()
+LLGridManager::~LLGridManager()
{
- // Clear URIs when picking a new server
- gSavedSettings.setLLSD("CmdLineLoginURI", LLSD::emptyArray());
- gSavedSettings.setString("CmdLineHelperURI", "");
+ saveFavorites();
}
-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_INFOS("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())
{
- return "None";
+ grid[GRID_ID_VALUE] = name;
}
- else if(mGridChoice < GRID_INFO_OTHER)
+ else
{
- return gGridInfo[mGridChoice].mLabel;
+ grid[GRID_ID_VALUE] = login_id;
}
-
- return mGridName;
-}
-
-std::string LLViewerLogin::getKnownGridLabel(EGridInfo grid_index) const
-{
- if(grid_index > GRID_INFO_NONE && grid_index < GRID_INFO_OTHER)
+
+ // only add the system grids beyond agni to the visible list
+ // if we're building a debug version.
+ if (name == std::string(MAINGRID))
+ {
+ grid[GRID_SLURL_BASE] = MAIN_GRID_SLURL_BASE;
+ grid[GRID_IS_FAVORITE_VALUE] = TRUE;
+ }
+ else
{
- return gGridInfo[grid_index].mLabel;
+ grid[GRID_SLURL_BASE] = llformat(SYSTEM_GRID_SLURL_BASE, label.c_str());
}
- return gGridInfo[GRID_INFO_NONE].mLabel;
+ addGrid(grid);
}
-void LLViewerLogin::getLoginURIs(std::vector<std::string>& uris) const
+// return a list of grid name -> grid label mappings for UI purposes
+std::map<std::string, std::string> LLGridManager::getKnownGrids(bool favorite_only)
{
- // return the login uri set on the command line.
- LLControlVariable* c = gSavedSettings.getControl("CmdLineLoginURI");
- if(c)
+ std::map<std::string, std::string> result;
+ for(LLSD::map_iterator grid_iter = mGridList.beginMap();
+ grid_iter != mGridList.endMap();
+ grid_iter++)
{
- LLSD v = c->getValue();
- if(v.isArray())
+ if(!favorite_only || grid_iter->second.has(GRID_IS_FAVORITE_VALUE))
{
- for(LLSD::array_const_iterator itr = v.beginArray();
- itr != v.endArray(); ++itr)
- {
- 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);
- }
+ result[grid_iter->first] = grid_iter->second[GRID_LABEL_VALUE].asString();
}
}
- // If there was no command line uri...
- if(uris.empty())
+ return result;
+}
+
+void LLGridManager::setGridChoice(const std::string& grid)
+{
+ // 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
+ for(LLSD::map_iterator grid_iter = mGridList.beginMap();
+ grid_iter != mGridList.endMap();
+ grid_iter++)
{
- // 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
+ if((grid == grid_iter->first) ||
+ (grid == grid_iter->second[GRID_LABEL_VALUE].asString()))
{
- uris.push_back(mGridName);
+ mGrid = grid_iter->second[GRID_VALUE].asString();
+ gSavedSettings.setString("CurrentGrid", grid_iter->second[GRID_VALUE]);
+ return;
+
}
}
+ LLSD grid_data = LLSD::emptyMap();
+ grid_data[GRID_VALUE] = grid;
+ addGrid(grid_data);
+ mGrid = grid;
+ gSavedSettings.setString("CurrentGrid", grid);
}
-std::string LLViewerLogin::getHelperURI() const
+std::string LLGridManager::getGridByLabel( const std::string &grid_label)
{
- std::string helper_uri = gSavedSettings.getString("CmdLineHelperURI");
- if (helper_uri.empty())
+ for(LLSD::map_iterator grid_iter = mGridList.beginMap();
+ grid_iter != mGridList.endMap();
+ grid_iter++)
{
- // grab URI from selected grid
- if(mGridChoice > GRID_INFO_NONE && mGridChoice < GRID_INFO_OTHER)
+ if (grid_iter->second.has(GRID_LABEL_VALUE) && (grid_iter->second[GRID_LABEL_VALUE].asString() == grid_label))
{
- helper_uri = gGridInfo[mGridChoice].mHelperURI;
+ return grid_iter->first;
}
+ }
+ return std::string();
+}
- 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
- }
+void LLGridManager::getLoginURIs(std::vector<std::string>& uris)
+{
+ uris.clear();
+ for (LLSD::array_iterator llsd_uri = mGridList[mGrid][GRID_LOGIN_URI_VALUE].beginArray();
+ llsd_uri != mGridList[mGrid][GRID_LOGIN_URI_VALUE].endArray();
+ llsd_uri++)
+ {
+ uris.push_back(llsd_uri->asString());
}
- return helper_uri;
}
-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 +540,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..0271e7a7a5 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,134 @@
#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);
+
+ LLSD getGridInfo(const std::string& grid)
+ {
+ if(mGridList.has(grid))
+ {
+ return mGridList[grid];
+ }
+ else
+ {
+ return LLSD();
+ }
+ }
+
+ // 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() {return mGridList[mGrid][GRID_HELPER_URI_VALUE];}
+ std::string getLoginPage() {return mGridList[mGrid][GRID_LOGIN_PAGE_VALUE];}
+ 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); }
+
+ LLSD getGridInfo() { return mGridList[mGrid]; }
+
+ std::string getGridByLabel( const std::string &grid_label);
+
+ 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 b5642d07a5..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);
}
}
@@ -2169,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)
@@ -2480,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,
@@ -2536,7 +2545,7 @@ void LLViewerObject::loadTaskInvFile(const std::string& filename)
}
else
{
- mInventory = new InventoryObjectList;
+ mInventory = new LLInventoryObject::object_list_t;
}
while(ifs.good())
{
@@ -2669,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)
@@ -2683,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)
@@ -2718,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;
@@ -2757,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];
@@ -4029,7 +4038,8 @@ LLBBox LLViewerObject::getBoundingBoxAgent() const
avatar_parent = (LLViewerObject*)root_edit->getParent();
}
- if (avatar_parent && avatar_parent->isAvatar() && root_edit && root_edit->mDrawable.notNull())
+ 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();
@@ -4080,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 )
@@ -4717,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;
@@ -4754,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;
@@ -4778,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;
@@ -4802,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;
@@ -4826,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;
@@ -4850,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;
@@ -4918,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 6347090f71..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"
@@ -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
}
}
@@ -614,7 +614,7 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)
}
// Focused
- objectp = gAgent.getFocusObject();
+ objectp = gAgentCamera.getFocusObject();
if (objectp)
{
objectp->boostTexturePriority();
@@ -894,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.
@@ -942,7 +949,8 @@ void LLViewerObjectList::killAllObjects()
{
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);
@@ -1209,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;
@@ -1281,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();
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index 2c5c0a37e8..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"
@@ -210,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
@@ -302,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
@@ -312,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/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 1f6bbcbae8..a591cc1e14 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -2185,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 ce627494c8..c48668df9a 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -47,6 +47,7 @@
#include "v4math.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llcallingcard.h"
#include "llcaphttpsender.h"
#include "llcommandhandler.h"
@@ -626,6 +627,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 */
@@ -819,7 +840,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)
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 49d0900f2a..5c4d5a61fd 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.
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 133b6ee8c9..d8a9ce9374 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -492,6 +492,7 @@ void LLViewerTexture::init(bool firstinit)
mTextureState = NO_DELETE ;
mDontDiscard = FALSE;
+ mCanResetMaxVirtualSize = true ;
mMaxVirtualSize = 0.f;
mNeedsGLTexture = FALSE ;
mNeedsResetMaxVirtualSize = FALSE ;
@@ -540,6 +541,11 @@ void LLViewerTexture::setBoostLevel(S32 level)
if(mBoostLevel != LLViewerTexture::BOOST_NONE)
{
setNoDelete() ;
+
+ if(LLViewerTexture::BOOST_AVATAR_BAKED_SELF == mBoostLevel || LLViewerTexture::BOOST_AVATAR_BAKED == mBoostLevel)
+ {
+ mCanResetMaxVirtualSize = false ;
+ }
}
if(gAuditTexture)
{
@@ -613,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 ;
}
@@ -1071,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;
@@ -1426,15 +1433,15 @@ 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
@@ -1546,8 +1553,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
}
else
{
- // Leave the priority as-is
- return mDecodePriority;
+ priority = -1.f; //stop fetching
}
}
else if (cur_discard < 0)
@@ -1565,10 +1571,6 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
// larger mips are corrupted
priority = -3.0f;
}
- else if (cur_discard <= mDesiredDiscardLevel)
- {
- priority = -4.0f;
- }
else
{
// priority range = 100,000 - 500,000
@@ -1579,12 +1581,12 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
}
else if (!isJustBound() && mCachedRawImageReady)
{
- //if(mBoostLevel < BOOST_HIGH)
- //{
- // // We haven't rendered this in a while, de-prioritize it
- // desired_discard += 2;
- //}
- //else
+ if(mBoostLevel < BOOST_HIGH)
+ {
+ // 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;
@@ -1592,7 +1594,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
}
S32 ddiscard = cur_discard - desired_discard;
- ddiscard = llclamp(ddiscard, 0, MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY);
+ ddiscard = llclamp(ddiscard, -1, MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY);
priority = (ddiscard + 1) * PRIORITY_DELTA_DISCARD_LEVEL_FACTOR;
}
@@ -1670,7 +1672,11 @@ void LLViewerFetchedTexture::updateVirtualSize()
setAdditionalDecodePriority(facep->getImportanceToCamera()) ;
}
}
- mNeedsResetMaxVirtualSize = TRUE ;
+
+ if(mCanResetMaxVirtualSize)
+ {
+ mNeedsResetMaxVirtualSize = TRUE ;
+ }
reorganizeFaceList() ;
reorganizeVolumeList();
}
@@ -1751,7 +1757,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)
@@ -1887,11 +1893,17 @@ bool LLViewerFetchedTexture::updateFetch()
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)
{
@@ -1899,7 +1911,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,
@@ -2262,11 +2274,14 @@ void LLViewerFetchedTexture::destroyRawImage()
{
sRawCount--;
- if(mForceToSaveRawImage)
+ if(mIsRawImageValid)
{
- saveRawImage() ;
- }
- setCachedRawImage() ;
+ if(mForceToSaveRawImage)
+ {
+ saveRawImage() ;
+ }
+ setCachedRawImage() ;
+ }
}
mRawImage = NULL;
@@ -3293,7 +3308,10 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()
}
}
- mNeedsResetMaxVirtualSize = TRUE ;
+ if(mCanResetMaxVirtualSize)
+ {
+ mNeedsResetMaxVirtualSize = TRUE ;
+ }
reorganizeFaceList() ;
reorganizeVolumeList();
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index a09a711cc7..74c46f3070 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -263,6 +263,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 ;
@@ -456,6 +457,8 @@ public:
BOOL isFullyLoaded() const;
BOOL hasFetcher() const { return mHasFetcher;}
+ void setCanUseHTTP(bool can_use_http) {mCanUseHTTP = can_use_http;}
+
protected:
/*virtual*/ void switchToCachedImage();
S32 getCurrentDiscardLevelForFetching() ;
@@ -505,6 +508,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/llviewervisualparam.cpp b/indra/newview/llviewervisualparam.cpp
index fad398e00b..422e530dc6 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");
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index d0a1a31ebd..d91f232f0e 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"
@@ -363,9 +363,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]));
}
@@ -383,7 +383,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]));
@@ -620,107 +620,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 (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 (LLView::sDebugMouseHandling)
+
+ LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
+ if( mouse_captor )
{
- llinfos << buttonname << " Mouse " << buttonstatestr << " " << LLView::sMouseHandlerMessage << llendl;
+ S32 local_x;
+ S32 local_y;
+ mouse_captor->screenPointToLocal( x, y, &local_x, &local_y );
+ if (LLView::sDebugMouseHandling)
+ {
+ llinfos << buttonname << " Mouse " << buttonstatestr << " handled by captor " << mouse_captor->getName() << llendl;
+ }
+ 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 (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 (LLView::sDebugMouseHandling)
+ {
+ llinfos << buttonname << " Mouse " << buttonstatestr << " " << LLView::sMouseHandlerMessage << llendl;
+ }
+ return TRUE;
+ }
+ else if (LLView::sDebugMouseHandling)
+ {
+ 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
@@ -776,7 +781,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
@@ -797,7 +802,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.
@@ -824,20 +829,16 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi
if (slurl_dnd_enabled)
{
-
- // special case SLURLs
- // isValidSLURL() call was added here to make sure that dragged SLURL is valid (EXT-4964)
- if ( LLSLURL::isSLURL( data ) && LLSLURL::isValidSLURL( 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)
@@ -855,7 +856,11 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi
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)
{
@@ -886,29 +891,24 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi
// URL passes the whitelist
if (te->getMediaData()->checkCandidateUrl( url ) )
{
- // we are allowed to modify the object or we have navigate permissions
- // NOTE: Design states you you can change the URL if you have media
- // navigate permissions even if you do not have prim modify rights
- if ( obj->permModify() || obj->hasMediaPermission( te->getMediaData(), LLVOVolume::MEDIA_PERM_INTERACT ) )
+ // just navigate to the URL
+ if (obj->getMediaImpl(object_face))
{
- // just navigate to the URL
- if (obj->getMediaImpl(object_face))
- {
- obj->getMediaImpl(object_face)->navigateTo(url);
- }
- 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/
- // trigger us getting it. Hopefully.
- LLSD media_data;
- media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
- obj->syncMediaData(object_face, media_data, true, true);
- obj->sendMediaDataUpdate();
- }
- result = LLWindowCallbacks::DND_LINK;
+ obj->getMediaImpl(object_face)->navigateTo(url);
}
+ 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/
+ // trigger us getting it. Hopefully.
+ LLSD media_data;
+ media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
+ obj->syncMediaData(object_face, media_data, true, true);
+ obj->sendMediaDataUpdate();
+ }
+ result = LLWindowCallbacks::DND_LINK;
+
}
}
LLSelectMgr::getInstance()->unhighlightObjectOnly(mDragHoveredObject);
@@ -928,6 +928,7 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi
LLSelectMgr::getInstance()->highlightObjectOnly(mDragHoveredObject);
}
result = (! te->hasMedia()) ? LLWindowCallbacks::DND_COPY : LLWindowCallbacks::DND_LINK;
+
}
}
}
@@ -955,7 +956,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.
@@ -1072,7 +1073,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)
{
@@ -1094,7 +1095,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;
}
@@ -1124,7 +1125,7 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
{
// if we're in world, show a progress bar to hide reloading of textures
llinfos << "Restoring GL during activate" << llendl;
- restoreGL("Restoring...");
+ restoreGL(LLTrans::getString("ProgressRestoring"));
}
else
{
@@ -1151,9 +1152,9 @@ 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();
@@ -1171,7 +1172,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;
@@ -1351,7 +1352,8 @@ LLViewerWindow::LLViewerWindow(
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"));
@@ -1384,7 +1386,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;
@@ -1430,6 +1432,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();
@@ -1588,8 +1591,7 @@ void LLViewerWindow::initBase()
gToolTipView = getRootView()->getChild<LLToolTipView>("tooltip view");
// 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);
@@ -1608,8 +1610,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");
@@ -1667,26 +1669,6 @@ void LLViewerWindow::initWorldUI()
navbar->showFavoritesPanel(FALSE);
}
- if (!gSavedSettings.getBOOL("ShowCameraButton"))
- {
- LLBottomTray::getInstance()->showCameraButton(FALSE);
- }
-
- if (!gSavedSettings.getBOOL("ShowSnapshotButton"))
- {
- LLBottomTray::getInstance()->showSnapshotButton(FALSE);
- }
-
- if (!gSavedSettings.getBOOL("ShowMoveButton"))
- {
- LLBottomTray::getInstance()->showMoveButton(FALSE);
- }
-
- if (!gSavedSettings.getBOOL("ShowGestureButton"))
- {
- LLBottomTray::getInstance()->showGestureButton(FALSE);
- }
-
if ( gHUDView == NULL )
{
LLRect hud_rect = full_window;
@@ -1913,7 +1895,7 @@ void LLViewerWindow::reshape(S32 width, S32 height)
// store the mode the user wants (even if not there yet)
- gSavedSettings.setBOOL("WindowFullScreen", mWantFullscreen);
+ gSavedSettings.setBOOL("FullScreen", mWantFullscreen);
// store new settings for the mode we are in, regardless
if (!mWindow->getFullscreen())
@@ -1953,7 +1935,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 )
@@ -1974,15 +1956,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" );
}
@@ -2088,7 +2070,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();
@@ -2143,12 +2125,14 @@ void LLViewerWindow::draw()
// 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.
@@ -2156,68 +2140,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;
- }
+ if (gMenuHolder) gMenuHolder->hideMenus();
- // handle escape key
- //if (key == KEY_ESCAPE && mask == MASK_NONE)
- //{
+ // if CTRL-tabbing (and not just TAB with no focus), go into window cycle mode
+ gFloaterView->setCycleMode((mask & MASK_CONTROL) != 0);
- // *TODO: get this to play well with mouselook and hidden
- // cursor modes, etc, and re-enable.
- //if (gFocusMgr.getMouseCapture())
- //{
- // gFocusMgr.setMouseCapture(NULL);
- // return TRUE;
- //}
- //}
-
- // 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;
}
@@ -2270,7 +2234,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;
}
@@ -2282,50 +2246,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;
}
@@ -2424,7 +2348,7 @@ 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;
}
@@ -2519,7 +2443,9 @@ void LLViewerWindow::updateUI()
// 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 = !gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI);
+ updateWorldViewRect(world_view_uses_full_window);
LLView::sMouseHandlerMessage.clear();
@@ -2569,28 +2495,55 @@ 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
- LLPopupView::popup_list_t popups = mPopupView->getCurrentPopups();
+ // aggregate visible views that contain mouse cursor in display order
+ LLPopupView::popup_list_t popups = mPopupView->getCurrentPopups();
- for(LLPopupView::popup_list_t::iterator popup_it = popups.begin(); popup_it != popups.end(); ++popup_it)
- {
- LLView* popup = popup_it->get();
- if (popup && popup->calcScreenBoundingRect().pointInRect(x, y))
+ for(LLPopupView::popup_list_t::iterator popup_it = popups.begin(); popup_it != popups.end(); ++popup_it)
+ {
+ LLView* popup = popup_it->get();
+ if (popup && popup->calcScreenBoundingRect().pointInRect(x, y))
+ {
+ // 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();
+ }
+ }
+ }
+ }
+
+ // 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 = popup->beginTreeDFS();
- it != popup->endTreeDFS();
+ for (LLView::tree_iterator_t it = top_ctrl->beginTreeDFS();
+ it != top_ctrl->endTreeDFS();
++it)
{
LLView* viewp = *it;
@@ -2607,57 +2560,34 @@ void LLViewerWindow::updateUI()
}
}
}
- }
-
- // 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)
- {
- 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();
}
}
}
@@ -2701,156 +2631,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);
- }
- }
- }
-
- // 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;
+ 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;
@@ -2966,6 +2910,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)
@@ -3068,6 +3017,12 @@ 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)
{
mWorldViewRectRaw = new_world_rect;
@@ -3148,7 +3103,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);
@@ -3175,7 +3130,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);
}
@@ -3294,7 +3249,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
@@ -3303,7 +3258,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;
}
@@ -3570,7 +3525,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
@@ -3617,7 +3572,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)
@@ -3631,7 +3586,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;
}
@@ -3649,12 +3604,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);
@@ -4038,9 +3993,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);
@@ -4113,6 +4065,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);
@@ -4596,7 +4551,7 @@ void LLViewerWindow::restoreGL(const std::string& progress_message)
gResizeScreenTexture = TRUE;
- if (gFloaterCustomize && gFloaterCustomize->getVisible())
+ if (gAgentCamera.cameraCustomizeAvatar())
{
LLVisualParamHint::requestHintUpdates();
}
@@ -4758,7 +4713,7 @@ void LLViewerWindow::restartDisplay(BOOL show_progress_bar)
stopGL();
if (show_progress_bar)
{
- restoreGL("Changing Resolution...");
+ restoreGL(LLTrans::getString("ProgressChangingResolution"));
}
else
{
@@ -4771,7 +4726,7 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size,
BOOL was_maximized = gSavedSettings.getBOOL("WindowMaximized");
mWantFullscreen = fullscreen;
mShowFullscreenProgress = show_progress_bar;
- gSavedSettings.setBOOL("WindowFullScreen", mWantFullscreen);
+ gSavedSettings.setBOOL("FullScreen", mWantFullscreen);
//gResizeScreenTexture = TRUE;
@@ -4845,7 +4800,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
{
@@ -5039,9 +4994,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;
}
@@ -5153,7 +5108,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/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 72b9c6df98..5d3c64f590 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,6 +66,7 @@
#include "llkeyframewalkmotion.h"
#include "llmutelist.h"
#include "llmoveview.h"
+#include "llnotificationsutil.h"
#include "llquantize.h"
#include "llregionhandle.h"
#include "llresmgr.h"
@@ -93,6 +95,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)
@@ -655,6 +663,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mNameMute(FALSE),
mRenderGroupTitles(sRenderGroupTitles),
mNameAppearance(FALSE),
+ mNameCloud(FALSE),
mFirstTEMessageReceived( FALSE ),
mFirstAppearanceMessageReceived( FALSE ),
mCulled( FALSE ),
@@ -664,6 +673,8 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mTexEyeColor( NULL ),
mNeedsSkin(FALSE),
mUpdatePeriod(1),
+ mFullyLoaded(FALSE),
+ mPreviousFullyLoaded(FALSE),
mFullyLoadedInitialized(FALSE),
mSupportsAlphaLayers(FALSE)
{
@@ -743,8 +754,11 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mOohMorph = NULL;
mAahMorph = NULL;
- mCurrentGesticulationLevel = 0;
+ mCurrentGesticulationLevel = 0;
+ mRuthTimer.reset();
+ mRuthDebugTimer.reset();
+ mDebugExistenceTimer.reset();
}
//------------------------------------------------------------------------
@@ -752,12 +766,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 +858,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 +915,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 +994,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 +1144,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 +1266,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 +1280,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 +1316,8 @@ void LLVOAvatar::initInstance(void)
//VTPause(); // VTune
- mVoiceVisualizer->setVoiceEnabled( gVoiceClient->getVoiceEnabled( mID ) );
+ mVoiceVisualizer->setVoiceEnabled( LLVoiceClient::getInstance()->getVoiceEnabled( mID ) );
+
}
const LLVector3 LLVOAvatar::getRenderPosition() const
@@ -2079,12 +2125,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());
@@ -2117,6 +2178,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)
@@ -2202,8 +2290,8 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
}
static LLUICachedControl<bool> visualizers_in_calls("ShowVoiceVisualizersInCalls", false);
- bool voice_enabled = (visualizers_in_calls || gVoiceClient->inProximalChannel()) &&
- gVoiceClient->getVoiceEnabled(mID);
+ bool voice_enabled = (visualizers_in_calls || LLVoiceClient::getInstance()->inProximalChannel()) &&
+ LLVoiceClient::getInstance()->getVoiceEnabled(mID);
idleUpdateVoiceVisualizer( voice_enabled );
idleUpdateMisc( detailed_update );
@@ -2219,13 +2307,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 )
{
//----------------------------------------------------------------
@@ -2253,7 +2342,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 );
}
}
@@ -2266,7 +2355,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())
{
@@ -2275,7 +2364,7 @@ void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
//printf( "gAwayTimer.reset();\n" );
}
- mVoiceVisualizer->setSpeakingAmplitude( gVoiceClient->getCurrentPower( mID ) );
+ mVoiceVisualizer->setSpeakingAmplitude( LLVoiceClient::getInstance()->getCurrentPower( mID ) );
if( isSelf() )
{
@@ -2504,7 +2593,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;
@@ -2546,7 +2635,7 @@ void LLVOAvatar::idleUpdateLoadingEffect()
llinfos << "self isFullyLoaded, first_fully_visible" << llendl;
first_fully_visible = false;
- LLAppearanceManager::instance().onFirstFullyVisible();
+ LLAppearanceMgr::instance().onFirstFullyVisible();
}
}
if (isFullyLoaded())
@@ -2671,7 +2760,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") ));
}
@@ -2769,17 +2858,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() ||
@@ -2787,7 +2892,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)
@@ -2841,7 +2948,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");
@@ -2850,6 +2962,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);
@@ -2934,14 +3047,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);
@@ -3235,7 +3341,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())
@@ -3266,7 +3372,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);
@@ -3677,7 +3783,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();
}
@@ -3837,7 +3943,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);
@@ -4040,7 +4146,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);
@@ -4102,6 +4208,8 @@ void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel
{
mMaxPixelArea = llmax(pixel_area, mMaxPixelArea);
mMinPixelArea = llmin(pixel_area, mMinPixelArea);
+ imagep->resetTextureStats();
+ imagep->setCanUseHTTP(false) ; //turn off http fetching for baked textures.
imagep->addTextureStats(pixel_area / texel_area_ratio);
imagep->setBoostLevel(boost_level);
}
@@ -4376,34 +4484,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);
}
//-----------------------------------------------------------------------------
@@ -4411,21 +4564,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);
}
//-----------------------------------------------------------------------------
@@ -4828,7 +4981,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;
@@ -4838,7 +4991,7 @@ BOOL LLVOAvatar::loadAvatar()
file << std::endl;
}
- file.close();*/
+ file.close();
return TRUE;
}
@@ -5206,7 +5359,7 @@ BOOL LLVOAvatar::updateJointLODs()
{
if (isSelf())
{
- if(gAgent.cameraCustomizeAvatar() || gAgent.cameraMouselook())
+ if(gAgentCamera.cameraCustomizeAvatar() || gAgentCamera.cameraMouselook())
{
mAdjustedPixelArea = MAX_PIXEL_AREA;
}
@@ -5352,7 +5505,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);
}
@@ -5385,7 +5538,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);
}
@@ -5440,7 +5593,7 @@ BOOL LLVOAvatar::setParent(LLViewerObject* parent)
ret = LLViewerObject::setParent(parent);
if (isSelf())
{
- gAgent.resetCamera();
+ gAgentCamera.resetCamera();
}
}
else
@@ -5480,6 +5633,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)
@@ -5625,15 +5786,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();
}
}
@@ -5651,6 +5812,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());
@@ -5720,9 +5883,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);
}
}
@@ -5785,11 +5948,6 @@ void LLVOAvatar::invalidateAll()
{
}
-// virtual
-void LLVOAvatar::setCompositeUpdatesEnabled( BOOL b )
-{
-}
-
void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake )
{
if (global_color == mTexSkinColor)
@@ -5828,27 +5986,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);
}
@@ -5863,19 +6023,29 @@ 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)
{
- /*
+
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();
}
@@ -5891,7 +6061,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 =
@@ -5942,7 +6124,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;
@@ -6195,7 +6377,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;
}
@@ -6268,6 +6450,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;
@@ -6343,23 +6533,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();
@@ -6863,8 +7053,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)
@@ -6877,12 +7066,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) &&
@@ -6898,7 +7087,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;
@@ -7685,7 +7874,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))
{
@@ -7793,3 +7982,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 b5f0ec7176..34791cf823 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; }
@@ -247,7 +250,8 @@ public:
public:
BOOL isFullyLoaded() const;
protected:
- virtual BOOL updateIsFullyLoaded();
+ virtual BOOL getIsCloud();
+ BOOL updateIsFullyLoaded();
BOOL processFullyLoadedChange(bool loading);
void updateRuthTimer(bool loading);
F32 calcMorphAmount();
@@ -460,7 +464,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 +532,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
@@ -642,7 +650,7 @@ public:
**/
public:
- virtual BOOL isWearingWearableType(EWearableType type ) const;
+ virtual BOOL isWearingWearableType(LLWearableType::EType type ) const;
//--------------------------------------------------------------------
// Attachments
@@ -826,6 +834,7 @@ private:
BOOL mNameBusy;
BOOL mNameMute;
BOOL mNameAppearance;
+ BOOL mNameCloud;
BOOL mRenderGroupTitles;
//--------------------------------------------------------------------
@@ -887,6 +896,9 @@ private:
** DIAGNOSTICS
**/
+ //--------------------------------------------------------------------
+ // General
+ //--------------------------------------------------------------------
public:
static void dumpArchetypeXML(void*);
static void dumpBakedStatus();
@@ -906,6 +918,14 @@ private:
F32 mAdjustedPixelArea;
std::string mDebugText;
+
+ //--------------------------------------------------------------------
+ // Avatar Rez Metrics
+ //--------------------------------------------------------------------
+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 +1043,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 7dc8772753..203ab45cf4 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);
}
@@ -489,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";
@@ -510,16 +532,17 @@ BOOL LLVOAvatarSelf::buildMenus()
return TRUE;
}
+void LLVOAvatarSelf::cleanup()
+{
+ markDead();
+ delete mScreenp;
+ mScreenp = NULL;
+ mRegionp = NULL;
+}
+
LLVOAvatarSelf::~LLVOAvatarSelf()
{
- // gAgents pointer might have been set to a different Avatar Self, don't get rid of it if so.
- if (gAgent.getAvatarObject() == this)
- {
- gAgent.setAvatarObject(NULL);
- gAgentWearables.setAvatarObject(NULL);
- }
- delete mScreenp;
- mScreenp = NULL;
+ cleanup();
}
/**
@@ -610,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)
@@ -620,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)
{
@@ -630,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)
{
@@ -640,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);
@@ -655,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)
{
@@ -673,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();
}
@@ -692,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();
@@ -765,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();
@@ -775,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)
{
@@ -789,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();
}
@@ -818,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() &&
@@ -872,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);
@@ -916,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();
@@ -937,7 +977,7 @@ void LLVOAvatarSelf::wearableUpdated( EWearableType type, BOOL upload_result )
// if we're editing our appearance, ensure that we're not using baked textures
// The baked texture for alpha masks is set explicitly when you hit "save"
- if (gAgent.cameraCustomizeAvatar())
+ if (gAgentCamera.cameraCustomizeAvatar())
{
setNewBakedTexture(index,IMG_DEFAULT_AVATAR);
}
@@ -947,11 +987,12 @@ void LLVOAvatarSelf::wearableUpdated( EWearableType type, BOOL upload_result )
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;
@@ -1025,7 +1066,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.
@@ -1033,7 +1074,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;
@@ -1066,13 +1107,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;
@@ -1082,19 +1123,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
@@ -1113,11 +1154,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();
}
@@ -1210,7 +1251,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++)
{
@@ -1232,6 +1273,8 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset)
//-----------------------------------------------------------------------------
BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) const
{
+ const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");
+
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
{
if (layerset == mBakedTextureDatas[i].mTexLayerSet)
@@ -1242,11 +1285,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)(override_tex_discard_level))
{
return FALSE;
}
@@ -1265,7 +1308,7 @@ BOOL LLVOAvatarSelf::isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32
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)
{
@@ -1291,6 +1334,32 @@ 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);
+}
+
+
//-----------------------------------------------------------------------------
// requestLayerSetUploads()
//-----------------------------------------------------------------------------
@@ -1359,22 +1428,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++)
@@ -1393,7 +1477,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();
}
@@ -1472,7 +1556,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.
@@ -1507,11 +1591,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();
}
@@ -1651,26 +1735,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 our body parts?
- if (gAgentWearables.getWearableCount(WT_SHAPE) == 0 ||
- gAgentWearables.getWearableCount(WT_HAIR) == 0 ||
- gAgentWearables.getWearableCount(WT_EYES) == 0 ||
- gAgentWearables.getWearableCount(WT_SKIN) == 0)
+ 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)
@@ -1678,52 +1760,102 @@ 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 processFullyLoadedChange(loading);
+ 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 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;
}
@@ -1733,13 +1865,7 @@ BOOL LLVOAvatarSelf::canGrabLocalTexture(ETextureIndex type, U32 index) const
// 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();
@@ -1812,7 +1938,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)
{
@@ -1867,6 +1993,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
@@ -1879,6 +2006,56 @@ 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());
+ LLNotificationsUtil::add("AvatarRezSelfNotification",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;
}
}
@@ -1908,9 +2085,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.
@@ -1927,13 +2102,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);
}
@@ -1944,12 +2119,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();
}
}
@@ -2029,10 +2204,9 @@ void LLVOAvatarSelf::onCustomizeStart()
// static
void LLVOAvatarSelf::onCustomizeEnd()
{
- LLVOAvatarSelf *avatarp = gAgent.getAvatarObject();
- if (avatarp)
+ if (isAgentAvatarValid())
{
- avatarp->invalidateAll();
+ gAgentAvatarp->invalidateAll();
}
}
@@ -2201,7 +2375,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 df3493c434..189c1ac808 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
@@ -178,6 +179,9 @@ public:
BOOL isLocalTextureDataFinal(const LLTexLayerSet* layerset) 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 +191,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);
@@ -216,6 +218,8 @@ public:
static void processRebakeAvatarTextures(LLMessageSystem* msg, void**);
protected:
/*virtual*/ void removeMissingBakedTextures();
+private:
+ LLFrameTimer mBakeTimeoutTimer;
//--------------------------------------------------------------------
// Layers
@@ -232,10 +236,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)
//--------------------------------------------------------------------
@@ -270,8 +280,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;
@@ -320,15 +330,48 @@ 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);
+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/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 fac7fa6a18..1b4471a9fe 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(
@@ -131,21 +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.
- // Using call of instanceExists() instead of gVoiceClient in check to avoid crash in LLVoiceClient::removeObserver()
- // when quitting viewer by closing console window before login (though in case of such quit crash will occur
- // later in other destructors anyway). EXT-5524
+ // 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);
@@ -165,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
@@ -286,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
@@ -332,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);
}
@@ -374,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));
@@ -425,7 +428,6 @@ void LLVoiceChannel::initClass()
sCurrentVoiceChannel = LLVoiceChannelProximal::getInstance();
}
-
//static
void LLVoiceChannel::suspend()
{
@@ -441,7 +443,7 @@ void LLVoiceChannel::resume()
{
if (sSuspended)
{
- if (gVoiceClient->voiceEnabled())
+ if (LLVoiceClient::getInstance()->voiceEnabled())
{
if (sSuspendedVoiceChannel)
{
@@ -511,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);
}
}
@@ -560,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();
}
}
@@ -659,7 +661,6 @@ void LLVoiceChannelGroup::setState(EState state)
LLVoiceChannelProximal::LLVoiceChannelProximal() :
LLVoiceChannel(LLUUID::null, LLStringUtil::null)
{
- activate();
}
BOOL LLVoiceChannelProximal::isActive()
@@ -671,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)
@@ -707,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);
@@ -767,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)
@@ -790,6 +791,12 @@ void LLVoiceChannelP2P::handleStatusChange(EStatusType type)
}
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;
}
@@ -841,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);
}
}
}
@@ -906,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 941cccacc3..573fab1f4f 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -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();
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 5ba13efca2..91353281a8 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,5336 +31,311 @@
#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;
-
-// 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;
-
-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;
- }
-
- 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();
- }
- }
-
- 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);
- }
- }
-
-private:
- int mRetries;
-};
-
-/**
- * @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 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();
-}
-
-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(!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)
- {
- 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))
- {
- 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))
- {
- gVoiceClient->deleteAllBuddies();
- }
- 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;
- }
- }
- 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:
-};
-
-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 -1 will be returned.
- * Internal level is calculated as: internal = 400 * external^2
- * Maps 0.0 to 1.0 to internal values 0-400
- *
- * @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)
-{
- // Return value of -1 indicates no level is stored for this speaker
- S32 ret_val = -1;
- 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),
- 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)
-{
- 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
+#include "llvoicevivox.h"
+#include "llviewernetwork.h"
+#include "llhttpnode.h"
+#include "llnotificationsutil.h"
+#include "llsdserialize.h"
+#include "llui.h"
- 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);
- }
+const F32 LLVoiceClient::OVERDRIVEN_POWER_LEVEL = 0.7f;
-#undef CASE
-
- return result;
-}
+const F32 LLVoiceClient::VOLUME_MIN = 0.f;
+const F32 LLVoiceClient::VOLUME_DEFAULT = 0.5f;
+const F32 LLVoiceClient::VOLUME_MAX = 1.0f;
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:
-
- 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(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
-
- // 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();
- }
-
- // 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)
+LLVoiceClient::LLVoiceClient()
{
- 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());
+ mVoiceModule = NULL;
}
-void LLVoiceClient::sessionMediaConnectSendMessage(sessionState *session)
-{
- 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)
+void LLVoiceClient::updateSettings()
{
- LL_DEBUGS("Voice") << name << LL_ENDL;
- mRenderDevices.push_back(name);
+ if (mVoiceModule) mVoiceModule->updateSettings();
}
-LLVoiceClient::deviceList *LLVoiceClient::getRenderDevices()
-{
- return &mRenderDevices;
-}
-
-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)
- {
- mTuningSpeakerVolume = scaled_volume;
- mTuningSpeakerVolumeDirty = true;
- }
-}
-
-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)
+ if (mVoiceModule)
{
- 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;
- }
- }
+ return mVoiceModule->inTuningMode();
}
-
- 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 LLVoiceClient::buildSetCaptureDevice(std::ostringstream &stream)
-{
- if(mCaptureDeviceDirty)
+ else
{
- 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;
+ return false;
}
}
-void LLVoiceClient::buildSetRenderDevice(std::ostringstream &stream)
+void LLVoiceClient::tuningSetMicVolume(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->tuningSetMicVolume(volume);
}
-void LLVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream)
+void LLVoiceClient::tuningSetSpeakerVolume(float volume)
{
- 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";
- }
-
-
+ if (mVoiceModule) mVoiceModule->tuningSetSpeakerVolume(volume);
}
-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)
- {
- 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 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)
+ if (mVoiceModule)
{
- 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);
- }
- }
+ return mVoiceModule->deviceSettingsAvailable();
}
else
{
- LL_DEBUGS("Voice") << "SessionGroup.AddSession response received (success), session handle is " << sessionHandle << LL_ENDL;
- if(session)
- {
- setSessionHandle(session, sessionHandle);
- }
+ return false;
}
}
-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?
- }
-
- mConnected = false;
+ if (mVoiceModule) mVoiceModule->setCaptureDevice(name);
- 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;
+//--------------------------------------------------
+// text chat
- 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)
+BOOL LLVoiceClient::isSessionTextIMPossible(const LLUUID& id)
{
- sessionState *session = findSession(sessionHandle);
- if(session)
+ if (mVoiceModule)
{
- participantState *participant = session->findParticipant(uriString);
- if(participant)
- {
- session->removeParticipant(participant);
- }
- else
- {
- LL_DEBUGS("Voice") << "unknown participant " << uriString << LL_ENDL;
- }
+ return mVoiceModule->isSessionTextIMPossible(id);
}
else
{
- LL_DEBUGS("Voice") << "unknown session " << sessionHandle << LL_ENDL;
- }
-}
-
-
-void LLVoiceClient::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;
- }
- 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;
- }
- }
- 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)
-{
- 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 LLVoiceClient::sessionNotificationEvent(std::string &sessionHandle, std::string &uriString, std::string &notificationType)
+BOOL LLVoiceClient::sendTextMessage(const LLUUID& participant_id, const std::string& message)
{
- sessionState *session = findSession(sessionHandle);
-
- if(session)
+ if (mVoiceModule)
{
- 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);
- if (result->mUserVolume != -1)
- {
- result->mVolumeDirty = true;
- mVolumeDirty = true;
- }
-
- 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;
-}
-
-LLVoiceClient::participantState* LLVoiceClient::sessionState::findParticipantByID(const LLUUID& id)
-{
- participantState * result = NULL;
- participantUUIDMap::iterator iter = mParticipantsByUUID.find(&id);
-
- if(iter != mParticipantsByUUID.end())
- {
- result = iter->second;
- }
-
- return result;
-}
-
-LLVoiceClient::participantState* LLVoiceClient::findParticipantByID(const LLUUID& id)
-{
- participantState * result = NULL;
-
- if(mAudioSession)
- {
- result = mAudioSession->findParticipantByID(id);
- }
-
- return result;
+ return FALSE;
+ }
}
-
-void LLVoiceClient::parcelChanged()
+void LLVoiceClient::endUserIMSession(const LLUUID& participant_id)
{
- if(getState() >= stateNoChannel)
+ if (mVoiceModule)
{
- // 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;
+ mVoiceModule->endUserIMSession(participant_id);
}
}
-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;
}
}
@@ -5369,1908 +343,608 @@ 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);
- }
-}
-
-void LLVoiceClient::callUser(const LLUUID &uuid)
-{
- std::string userURI = sipURIFromID(uuid);
-
- switchChannel(userURI, false, true, true);
+ if (mVoiceModule) mVoiceModule->setSpatialChannel(uri, credentials);
}
-LLVoiceClient::sessionState* LLVoiceClient::startUserIMSession(const LLUUID &uuid)
+void LLVoiceClient::leaveNonSpatialChannel()
{
- // 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;
+ if (mVoiceModule) mVoiceModule->leaveNonSpatialChannel();
}
-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());
- }
- }
- else
- {
- // Session isn't connected yet, defer until later.
+ return mVoiceModule->getCurrentChannel();
}
-}
-
-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;
+ return std::string();
}
}
-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);
+ return false;
}
}
-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 result;
-}
-
-bool LLVoiceClient::inProximalChannel()
-{
- bool result = false;
-
- if((getState() == stateRunning) && !mSessionTerminateRequested)
- {
- result = inSpatialChannel();
- }
-
- 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)
+bool LLVoiceClient::answerInvite(std::string &channelHandle)
{
- std::string result;
- if(avatar)
+ if (mVoiceModule)
{
- 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;
+ return mVoiceModule->answerInvite(channelHandle);
}
- // 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)
+void LLVoiceClient::setVoiceEnabled(bool enabled)
{
-
- 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
- }
- }
+ if (mVoiceModule) mVoiceModule->setVoiceEnabled(enabled);
}
-void LLVoiceClient::setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot)
+void LLVoiceClient::setLipSyncEnabled(BOOL enabled)
{
- mCameraRequestedPosition = position;
-
- if(mCameraVelocity != velocity)
- {
- mCameraVelocity = velocity;
- mSpatialCoordsDirty = true;
- }
-
- if(mCameraRot != rot)
- {
- mCameraRot = rot;
- mSpatialCoordsDirty = true;
- }
+ if (mVoiceModule) mVoiceModule->setLipSyncEnabled(enabled);
}
-void LLVoiceClient::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 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)
- // 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);
-}
-
-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()
{
- 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())
+ if (mVoiceModule)
{
- // 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;
-
- 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)
-{
- // 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;
+///////////////////
+// version checking
- if(!handle.empty())
- {
- mSessionsByHandle.insert(sessionMap::value_type(&(session->mHandle), session));
- }
-
- verifySessionState();
-}
-
-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;
-
- 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())
+ if ((volume >= LLVoiceClient::VOLUME_MIN) && (volume <= LLVoiceClient::VOLUME_MAX))
{
- // 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;
-}
+ mSpeakersData[speaker_id] = volume;
-LLVoiceClient::buddyListEntry *LLVoiceClient::findBuddy(const std::string &uri)
-{
- buddyListEntry *result = NULL;
- buddyListMap::iterator iter = mBuddyListMap.find(&uri);
- if(iter != mBuddyListMap.end())
- {
- result = iter->second;
+ // 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 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);
-}
-
-void LLVoiceClient::removeObserver(LLVoiceClientParticipantObserver* observer)
-{
- mParticipantObservers.erase(observer);
-}
-
-void LLVoiceClient::notifyParticipantObservers()
-{
- for (observer_set_t::iterator it = mParticipantObservers.begin();
- it != mParticipantObservers.end();
- )
- {
- LLVoiceClientParticipantObserver* observer = *it;
- observer->onChange();
- // In case onChange() deleted an entry.
- it = mParticipantObservers.upper_bound(observer);
- }
-}
+ F32 volume_out = 0.f;
+ volume_in = llclamp(volume_in, 0.f, 1.0f);
-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 (volume_in <= 0.56f)
{
- 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;
- }
- }
+ volume_out = sqrt(volume_in / (4.f * 0.56f));
}
-
- 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 aaacab69e0..e08fed7ae9 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,9 +40,14 @@ class LLVivoxProtocolParser;
#include "v3math.h"
#include "llframetimer.h"
#include "llviewerregion.h"
-#include "m3math.h" // LLMatrix3
+#include "llcallingcard.h" // for LLFriendObserver
+#include "llsecapi.h"
+
+// devices
+
+typedef std::vector<std::string> LLVoiceDeviceList;
+
-class LLFriendObserver;
class LLVoiceClientParticipantObserver
{
public:
@@ -52,6 +55,9 @@ public:
virtual void onChange() = 0;
};
+
+///////////////////////////////////
+/// @class LLVoiceClientStatusObserver
class LLVoiceClientStatusObserver
{
public:
@@ -65,11 +71,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,694 +85,379 @@ 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;
-
- void updateSettings(); // call after loading settings and whenever they change
-
- 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();
-
- 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();
-
- // 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
+ std::string serverType;
+ std::string serverVersion;
+};
-
- 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 LLVoiceModuleInterface
+/// @brief Voice module interface
+///
+/// Voice modules should provide an implementation for this interface.
+/////////////////////////////////
- /////////////////////////////
- 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);
+class LLVoiceModuleInterface
+{
+public:
+ LLVoiceModuleInterface() {}
+ virtual ~LLVoiceModuleInterface() {}
+
+ 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()=0; // connected to a voice server and voice channel
- void verifySessionState(void);
+ 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;
+ //@}
+
+};
- 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);
-
- 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);
+class LLVoiceClient: public LLSingleton<LLVoiceClient>
+{
+ LOG_CLASS(LLVoiceClient);
+public:
+ LLVoiceClient();
+ ~LLVoiceClient();
- void addObserver(LLVoiceClientStatusObserver* observer);
- void removeObserver(LLVoiceClientStatusObserver* observer);
+ 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;
- 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;
+ static const F32 VOLUME_MIN;
+ static const F32 VOLUME_DEFAULT;
+ static const F32 VOLUME_MAX;
- 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();
+ void updateSettings(); // call after loading settings and whenever they change
- // 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();
+ bool isVoiceWorking(); // connected to a voice server and voice channel
- 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);
+ // tuning
+ void tuningStart();
+ void tuningStop();
+ bool inTuningMode();
- 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;
- // 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; };
- 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;
-
- 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);
- 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 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);
+ //@}
+
- int mMicVolume;
- bool mMicVolumeDirty;
-
- bool mVoiceEnabled;
- bool mWriteInProgress;
- std::string mWriteString;
-
- LLTimer mUpdateTimer;
+ 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);
- BOOL mLipSyncEnabled;
-
- std::string mAPIVersion;
-
- typedef std::set<LLVoiceClientParticipantObserver*> observer_set_t;
- observer_set_t mParticipantObservers;
-
- void notifyParticipantObservers();
+protected:
+ LLVoiceModuleInterface* mVoiceModule;
+ LLPumpIO *m_servicePump;
+};
- 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..bcb1a70efb
--- /dev/null
+++ b/indra/newview/llvoicevivox.cpp
@@ -0,0 +1,6944 @@
+ /**
+ * @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 "llviewerwindow.h"
+#include "llviewercamera.h"
+
+#include "llfloaterfriends.h" //VIVOX, inorder to refresh communicate panel
+#include "llviewernetwork.h"
+#include "llnotificationsutil.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
+
+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;
+
+
+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 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)
+
+
+
+{
+ 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()
+{
+
+// leaveAudioSession();
+ 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);
+ connectorShutdown();
+ closeSocket(); // Need to do this now -- bad things happen if the destructor does it later.
+
+ // This will do unpleasant things on windows.
+// 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(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;
+}
+
+
+
+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();
+
+ 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: 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);
+
+ // 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());
+ }
+ }
+
+#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:
+
+ 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(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
+
+ // 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();
+ }
+
+ // 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();
+
+ 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 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;
+
+ 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 LLVivoxVoiceClient::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 LLVivoxVoiceClient::sessionMediaConnectSendMessage(sessionState *session)
+{
+ 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 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;
+ 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);
+ }
+ }
+ }
+}
+
+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::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);
+ }
+ }
+
+ }
+ 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),
+ mOnMuteList(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 tells code in LLVivoxVoiceClient that the ID will not be in the name cache.
+ setUUIDFromStringHash(result->mAvatarID, 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()
+{
+ //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;
+ }
+ }
+}
+
+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),
+ 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;
+
+ 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->onChange();
+ // In case onChange() 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);
+ }
+
+ }
+ }
+}
+
+
+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();
+ }
+
+ }
+ }
+ 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;
+
+
+ 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"))
+ {
+ 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, "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"))
+ {
+ 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.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..59fec8b954
--- /dev/null
+++ b/indra/newview/llvoicevivox.h
@@ -0,0 +1,917 @@
+/**
+ * @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 LLVivoxVoiceClientParticipantObserver
+{
+public:
+ virtual ~LLVivoxVoiceClientParticipantObserver() { }
+ virtual void onChange() = 0;
+};
+
+
+class LLVivoxVoiceClient: public LLSingleton<LLVivoxVoiceClient>, virtual public LLVoiceModuleInterface
+{
+ 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();
+
+ /////////////////////
+ /// @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);
+ //@}
+
+
+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 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;
+ };
+
+ // 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,
+ 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.
+ };
+
+ 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();
+
+ bool inTuningStates();
+
+ //----------------------------------
+ // 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 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);
+
+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();
+};
+
+/**
+ * @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;
+
+
+ // 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);
+
+};
+
+
+#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/llvotree.cpp b/indra/newview/llvotree.cpp
index 55e2c58a52..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;
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 86d8204473..d6453111d7 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -369,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;
@@ -962,8 +962,11 @@ void LLVOVolume::updateSculptTexture()
if (isSculpted())
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- LLUUID id = sculpt_params->getSculptTexture();
- mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+ LLUUID id = sculpt_params->getSculptTexture();
+ if (id.notNull())
+ {
+ mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+ }
}
else
{
@@ -1853,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;
@@ -3290,7 +3298,6 @@ static LLFastTimer::DeclareTimer FTM_REBUILD_VBO("VBO Rebuilt");
void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
{
- llpushcallstacks ;
if (group->changeLOD())
{
group->mLastUpdateDistance = group->mDistance;
@@ -3521,7 +3528,6 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM("Volume Geometry");
void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
{
- llpushcallstacks ;
llassert(group);
if (group && group->isState(LLSpatialGroup::MESH_DIRTY) && !group->isState(LLSpatialGroup::GEOM_DIRTY))
{
@@ -3613,7 +3619,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/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..9e9b46473e 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 );
}
}
@@ -653,14 +657,14 @@ void LLWearable::writeToAvatar()
}
LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE );
// MULTI-WEARABLE: replace hard-coded 0
- avatar->setLocalTextureTE(te, image, 0);
+ 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, TRUE);
// 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..fb7577c008
--- /dev/null
+++ b/indra/newview/llwearableitemslist.cpp
@@ -0,0 +1,553 @@
+/**
+ * @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 "llinventorymodel.h"
+#include "llmenugl.h" // for LLContextMenu
+#include "lltransutil.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
+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");
+
+ 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");
+
+ 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;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLPanelDummyClothingListItem* LLPanelDummyClothingListItem::create(LLWearableType::EType w_type)
+{
+ LLPanelDummyClothingListItem* list_item = new LLPanelDummyClothingListItem(w_type);
+ list_item->init();
+ return list_item;
+}
+
+void LLPanelDummyClothingListItem::updateItem()
+{
+ std::string title = wearableTypeToString(mWearableType);
+ setTitle(title, LLStringUtil::null);
+}
+
+BOOL LLPanelDummyClothingListItem::postBuild()
+{
+ LLIconCtrl* icon = getChild<LLIconCtrl>("item_icon");
+ setIconCtrl(icon);
+ setTitleCtrl(getChild<LLTextBox>("item_name"));
+
+ addWidgetToRightSide("btn_add");
+
+ setIconImage(LLInventoryIcon::getIcon(LLAssetType::AT_CLOTHING, LLInventoryType::IT_NONE, FALSE, mWearableType, FALSE));
+ updateItem();
+
+ // Make it look loke clothing item - reserve space for 'delete' button
+ setLeftWidgetsWidth(icon->getRect().mLeft);
+
+ setWidgetsVisible(false);
+ reshapeWidgets();
+
+ return TRUE;
+}
+
+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()
+: use_internal_context_menu("use_internal_context_menu", true)
+{}
+
+LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p)
+: LLInventoryItemsList(p)
+{
+ setComparator(&WEARABLE_TYPE_NAME_COMPARATOR);
+ if (p.use_internal_context_menu)
+ {
+ setRightMouseDownCallback(boost::bind(&LLWearableItemsList::onRightClick, this, _2, _3));
+ }
+}
+
+// virtual
+LLWearableItemsList::~LLWearableItemsList()
+{}
+
+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::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
+//////////////////////////////////////////////////////////////////////////
+
+// 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, 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.Edit", boost::bind(handleMultiple, LLAgentWearables::editWearable, ids));
+ registrar.add("Wearable.ShowOriginal", boost::bind(show_item_original, selected_id));
+
+ // 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));
+
+ // Create the menu.
+ LLContextMenu* menu = createFromFile("menu_wearable_list_item.xml");
+
+ // Determine which items should be visible/enabled.
+ updateItemsVisibility(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 nitems = ids.size(); // number of selected items
+ U32 nworn = 0; // number of worn items among the selected ones
+ U32 nwornlinks = 0; // number of worn links among the selected items
+ U32 neditable = 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)
+ {
+ ++nworn;
+
+ if (is_link)
+ {
+ ++nwornlinks;
+ }
+ }
+ if (is_editable)
+ {
+ ++neditable;
+ }
+ } // for
+
+ // *TODO: eliminate multiple traversals over the menu items
+ // *TODO: try disabling items rather than hiding them
+ // *FIX: we may hide *all* items and thus get an ugly empty menu
+ setMenuItemVisible(menu, "wear", nworn == 0);
+ setMenuItemVisible(menu, "edit", mask & (MASK_CLOTHING|MASK_BODYPART) && nitems == 1 && neditable == 1);
+ setMenuItemVisible(menu, "show_original", nitems == 1 && nwornlinks == nitems);
+ setMenuItemVisible(menu, "take_off", mask == MASK_CLOTHING && nworn == nitems); // selected only worn clothes
+ setMenuItemVisible(menu, "detach", mask == MASK_ATTACHMENT && nworn == nitems);
+ setMenuItemVisible(menu, "object_profile", mask == MASK_ATTACHMENT && nitems == 1);
+}
+
+// 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.
+void LLWearableItemsList::ContextMenu::setMenuItemVisible(LLContextMenu* menu, const std::string& name, bool val)
+{
+ menu->setItemVisible(name, val);
+}
+
+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
+ {
+ llwarns << "Unsupported asset type: " << at << llendl;
+ }
+}
+
+// EOF
diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h
new file mode 100644
index 0000000000..7ad1b5a3ad
--- /dev/null
+++ b/indra/newview/llwearableitemslist.h
@@ -0,0 +1,320 @@
+/**
+ * @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 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();
+};
+
+/**
+ * @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", 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", 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*/ void updateItem();
+ /*virtual*/ BOOL postBuild();
+
+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>
+ {
+ protected:
+ enum {
+ MASK_CLOTHING = 0x01,
+ MASK_BODYPART = 0x02,
+ MASK_ATTACHMENT = 0x04,
+ };
+
+ /* virtual */ LLContextMenu* createMenu();
+ void updateItemsVisibility(LLContextMenu* menu);
+ void setMenuItemVisible(LLContextMenu* menu, const std::string& name, bool val);
+ void updateMask(U32& mask, LLAssetType::EType at);
+ };
+
+ struct Params : public LLInitParam::Block<Params, LLInventoryItemsList::Params>
+ {
+ Optional<bool> use_internal_context_menu;
+
+ Params();
+ };
+
+ virtual ~LLWearableItemsList();
+
+ void updateList(const LLUUID& category_id);
+
+protected:
+ friend class LLUICtrlFactory;
+ LLWearableItemsList(const LLWearableItemsList::Params& p);
+
+ void onRightClick(S32 x, S32 y);
+};
+
+#endif //LL_LLWEARABLEITEMSLIST_H
diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp
index b2de31218b..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,16 +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 );
- LLSD item_name = LLSD().with("[WEARABLE_ITEM]", wearable->getTypeLabel());
- std::string name = LLTrans::getString("NewWearable");
- LLStringUtil::format(name, item_name);
+ 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..c692df06ad
--- /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, NULL);
+}
+
+// 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 3385b75c65..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,7 +174,7 @@ 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();
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/llworld.cpp b/indra/newview/llworld.cpp
index d7e5b464a6..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;
}
@@ -660,16 +663,41 @@ void LLWorld::updateClouds(const F32 dt)
static LLFastTimer::DeclareTimer ftm("World Clouds");
LLFastTimer t(ftm);
- if (gSavedSettings.getBOOL("FreezeTime") ||
- !gSavedSettings.getBOOL("SkyUseClassicClouds"))
+ 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)
{
@@ -1208,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/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 5edf72d4ae..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"
@@ -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..bc7f8ec854 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,74 @@ 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
+ {
+ chain->validate(VALIDATION_POLICY_SSL, store, 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 +310,7 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)
{
mCurlRequest = new LLCurlEasyRequest();
}
+ mErrorCert = NULL;
if (gSavedSettings.getBOOL("BrowserProxyEnabled"))
{
@@ -252,10 +326,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 +418,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,15 +508,10 @@ 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.";
+ mStatusMessage = LLTrans::getString("server_is_down");
mStatusURI = "http://secondlife.com/status/";
}
@@ -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 259ca21e93..cc65b34a61 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"
@@ -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;
@@ -1779,6 +1781,12 @@ void LLPipeline::updateGL()
void LLPipeline::rebuildPriorityGroups()
{
+ if(!sAllowRebuildPriorityGroup)
+ {
+ return ;
+ }
+ sAllowRebuildPriorityGroup = FALSE ;
+
LLTimer update_timer;
LLMemType mt(LLMemType::MTYPE_PIPELINE);
@@ -1798,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);
@@ -2200,7 +2207,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
//LLVertexBuffer::unbind();
grabReferences(result);
-
+ llpushcallstacks ;
for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
{
LLSpatialGroup* group = *iter;
@@ -2218,7 +2225,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
}
}
}
-
+ llpushcallstacks ;
for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
{
LLSpatialGroup* group = *iter;
@@ -2234,7 +2241,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
}
}
-
+ llpushcallstacks ;
if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD)
{
for (LLCullResult::bridge_list_t::iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
@@ -2248,7 +2255,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
}
}
}
-
+ llpushcallstacks ;
{
LLFastTimer ftm(FTM_STATESORT_DRAWABLE);
for (LLCullResult::drawable_list_t::iterator iter = sCull->beginVisibleList();
@@ -2268,6 +2275,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
}
postSort(camera);
+ llpushcallstacks ;
}
void LLPipeline::stateSort(LLSpatialGroup* group, LLCamera& camera)
@@ -2957,6 +2965,9 @@ void LLPipeline::renderHighlights()
}
}
+//debug use
+U32 LLPipeline::sCurRenderPoolType = 0 ;
+
void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
{
LLMemType mt(LLMemType::MTYPE_PIPELINE_RENDER_GEOM);
@@ -3066,6 +3077,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;
@@ -3855,15 +3869,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;
@@ -3963,9 +3976,9 @@ void LLPipeline::rebuildPools()
max_count--;
}
- if (gAgent.getAvatarObject())
+ if (isAgentAvatarValid())
{
- gAgent.getAvatarObject()->rebuildHUD();
+ gAgentAvatarp->rebuildHUD();
}
}
@@ -4361,7 +4374,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();
@@ -4597,8 +4610,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;
@@ -4707,15 +4720,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));
}
@@ -7097,18 +7108,19 @@ 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)
+ llpushcallstacks ;
+ if (!skip_avatar_update)
{
- avatar->updateAttachmentVisibility(CAMERA_MODE_THIRD_PERSON);
+ gAgentAvatarp->updateAttachmentVisibility(CAMERA_MODE_THIRD_PERSON);
}
LLVertexBuffer::unbind();
@@ -7193,7 +7205,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
glCullFace(GL_FRONT);
-
static LLCullResult ref_result;
U32 ref_mask = 0;
if (LLDrawPoolWater::sNeedsDistortionUpdate)
@@ -7205,6 +7216,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
(1 << LLPipeline::RENDER_TYPE_WL_SKY));
static LLCullResult result;
updateCull(camera, result);
+ llpushcallstacks ;
stateSort(camera, result);
mRenderTypeMask = tmp & ((1 << LLPipeline::RENDER_TYPE_SKY) |
(1 << LLPipeline::RENDER_TYPE_CLOUDS) |
@@ -7239,13 +7251,13 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
LLGLUserClipPlane clip_plane(plane, mat, projection);
LLGLDisable cull(GL_CULL_FACE);
updateCull(camera, ref_result, 1);
+ llpushcallstacks ;
stateSort(camera, ref_result);
}
ref_mask = mRenderTypeMask;
mRenderTypeMask = mask;
}
-
if (LLDrawPoolWater::sNeedsDistortionUpdate)
{
mRenderTypeMask = ref_mask;
@@ -7263,7 +7275,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
}
camera.setOrigin(camera_in.getOrigin());
-
//render distortion map
static BOOL last_update = TRUE;
if (last_update)
@@ -7297,6 +7308,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
LLGLUserClipPlane clip_plane(LLPlane(-pnorm, -(pd+pad)), mat, projection);
static LLCullResult result;
updateCull(camera, result, water_clip);
+ llpushcallstacks ;
stateSort(camera, result);
gGL.setColorMask(true, true);
@@ -7320,7 +7332,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;
@@ -7332,10 +7343,11 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
LLGLState::checkTextureChannels();
LLGLState::checkClientArrays();
- if (avatar)
+ if (!skip_avatar_update)
{
- avatar->updateAttachmentVisibility(gAgent.getCameraMode());
+ gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode());
}
+ llpushcallstacks ;
}
}
@@ -7833,7 +7845,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 6aecc23aac..89649a0682 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -462,6 +462,7 @@ public:
static BOOL sRenderAttachedLights;
static BOOL sRenderAttachedParticles;
static BOOL sRenderDeferred;
+ static BOOL sAllowRebuildPriorityGroup;
static S32 sVisibleLightCount;
static F32 sMinRenderSize;
@@ -686,6 +687,9 @@ protected:
public:
static BOOL sRenderBeacons;
static BOOL sRenderHighlight;
+
+ //debug use
+ static U32 sCurRenderPoolType ;
};
void render_bbox(const LLVector3 &min, const LLVector3 &max);
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.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..731953f9bb 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,0,2,0
+ PRODUCTVERSION 2,0,2,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.0.2.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.0.2.0"
END
END
BLOCK "VarFileInfo"
@@ -166,12 +161,6 @@ BEGIN
END
END
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Bitmap
-//
-
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index d45d6155dd..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" />
@@ -359,7 +359,7 @@
reference="White"/>
<color
name="GroupNotifyDimmedTextColor"
- reference="DkGray" />
+ reference="LtGray" />
<color
name="GroupOverTierColor"
value="0.43 0.06 0.06 1" />
@@ -392,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" />
@@ -421,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
@@ -524,7 +530,7 @@
reference="Unused?" />
<color
name="NetMapBackgroundColor"
- value="0 0 0 0.3" />
+ value="0 0 0 1" />
<color
name="NetMapGroupOwnAboveWater"
reference="Purple" />
@@ -731,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/textures/bottomtray/Movement_Left_Off.png b/indra/newview/skins/default/textures/bottomtray/Movement_Left_Off.png
new file mode 100644
index 0000000000..ded370a46f
--- /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..98bf415f84
--- /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..2d8d55fa91
--- /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..a91517d31f
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_Right_On.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_Large.png b/indra/newview/skins/default/textures/icons/Generic_Group_Large.png
index 4d4f1e1bee..c067646c65 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_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/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/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/locked_image.j2c b/indra/newview/skins/default/textures/locked_image.j2c
deleted file mode 100644
index 9e8998d675..0000000000
--- a/indra/newview/skins/default/textures/locked_image.j2c
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_infohub.tga b/indra/newview/skins/default/textures/map_infohub.tga
deleted file mode 100644
index 545b8e532c..0000000000
--- a/indra/newview/skins/default/textures/map_infohub.tga
+++ /dev/null
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 95913dd55b..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 b1594816b2..91890009f4 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,28 @@ 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="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="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 +91,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 +100,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 +107,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="4" scale.top="19" scale.right="99" scale.bottom="4" />
- <texture name="DropDown_Over" file_name="widgets/DropDown_Over.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_Selected" file_name="widgets/DropDown_Selected.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 +129,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 +138,21 @@ 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 +169,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 +187,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,7 +199,6 @@ 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" />
@@ -247,6 +206,7 @@ with the same filename but different name
<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" />
@@ -258,22 +218,58 @@ with the same filename but different name
<texture name="Inv_Sound" file_name="icons/Inv_Sound.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_Underpants" file_name="icons/Inv_Underpants.png" preload="false" />
<texture name="Inv_Undershirt" file_name="icons/Inv_Undershirt.png" preload="false" />
+ <texture name="Inv_Alpha_Link" file_name="icons/Inv_Alpha_Link.png" preload="false" />
+ <texture name="Inv_Animation_Link" file_name="icons/Inv_Animation_Link.png" preload="false" />
+ <texture name="Inv_BodyShape_Link" file_name="icons/Inv_BodyShape_Link.png" preload="false" />
+ <texture name="Inv_CallingCard_Link" file_name="icons/Inv_CallingCard_Link.png" preload="false" />
+ <texture name="Inv_Clothing_Link" file_name="icons/Inv_Clothing_Link.png" preload="false" />
+ <texture name="Inv_Eye_Link" file_name="icons/Inv_Eye_Link.png" preload="false" />
+ <texture name="Inv_FolderClosed_Link" file_name="icons/Inv_FolderClosed_Link.png" preload="false" />
+ <texture name="Inv_FolderOpen_Link" file_name="icons/Inv_FolderOpen_Link.png" preload="false" />
+ <texture name="Inv_Gesture_Link" file_name="icons/Inv_Gesture_Link.png" preload="false" />
+ <texture name="Inv_Gloves_Link" file_name="icons/Inv_Gloves_Link.png" preload="false" />
+ <texture name="Inv_Hair_Link" file_name="icons/Inv_Hair_Link.png" preload="false" />
+ <texture name="Inv_LinkItem_Link" file_name="icons/Inv_LinkItem_Link.png" preload="false" />
+ <texture name="Inv_LinkFolder_Link" file_name="icons/Inv_LinkFolder_Link.png" preload="false" />
+ <texture name="Inv_Jacket_Link" file_name="icons/Inv_Jacket_Link.png" preload="false" />
+ <texture name="Inv_LookFolderOpen_Link" file_name="icons/Inv_LookFolderOpen_Link.png" preload="false" />
+ <texture name="Inv_LookFolderClosed_Link" file_name="icons/Inv_LookFolderClosed_Link.png" preload="false" />
+ <texture name="Inv_Landmark_Link" file_name="icons/Inv_Landmark_Link.png" preload="false" />
+ <texture name="Inv_Notecard_Link" file_name="icons/Inv_Notecard_Link.png" preload="false" />
+ <texture name="Inv_Object_Link" file_name="icons/Inv_Object_Link.png" preload="false" />
+ <texture name="Inv_Object_Multi_Link" file_name="icons/Inv_Object_Multi_Link.png" preload="false" />
+ <texture name="Inv_Pants_Link" file_name="icons/Inv_Pants_Link.png" preload="false" />
+ <texture name="Inv_Script_Link" file_name="icons/Inv_Script_Link.png" preload="false" />
+ <texture name="Inv_Shirt_Link" file_name="icons/Inv_Shirt_Link.png" preload="false" />
+ <texture name="Inv_Shoe_Link" file_name="icons/Inv_Shoe_Link.png" preload="false" />
+ <texture name="Inv_Skin_Link" file_name="icons/Inv_Skin_Link.png" preload="false" />
+ <texture name="Inv_Skirt_Link" file_name="icons/Inv_Skirt_Link.png" preload="false" />
+ <texture name="Inv_Snapshot_Link" file_name="icons/Inv_Snapshot_Link.png" preload="false" />
+ <texture name="Inv_Socks_Link" file_name="icons/Inv_Socks_Link.png" preload="false" />
+ <texture name="Inv_Sound_Link" file_name="icons/Inv_Sound_Link.png" preload="false" />
+ <texture name="Inv_Tattoo_Link" file_name="icons/Inv_Tattoo_Link.png" preload="false" />
+ <texture name="Inv_Texture_Link" file_name="icons/Inv_Texture_Link.png" preload="false" />
+ <texture name="Inv_Underpants_Link" file_name="icons/Inv_Underpants_Link.png" preload="false" />
+ <texture name="Inv_Undershirt_Link" file_name="icons/Inv_Undershirt_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" 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 +278,19 @@ 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="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 +301,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" />
@@ -355,27 +342,15 @@ with the same filename but different name
<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="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 +362,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 +380,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 +388,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 +400,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 +418,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 +432,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 +445,10 @@ 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="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" />
@@ -519,63 +461,35 @@ with the same filename but different name
<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" />
@@ -584,8 +498,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" />
@@ -594,7 +506,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"
@@ -603,25 +514,19 @@ 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_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_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="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="16" scale.right="100" scale.bottom="3" />
@@ -631,9 +536,10 @@ 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="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" />
@@ -646,10 +552,7 @@ with the same filename but different name
<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="WebBasedMediaBackground" file_name="windows/WebBasedMediaBackground.png" preload="false" />
- <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" />
@@ -663,17 +566,7 @@ 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" />
@@ -683,11 +576,8 @@ with the same filename but different name
<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" />
@@ -709,12 +599,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" />
@@ -724,15 +608,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_top_pick.tga" />
<texture name="lag_status_critical.tga" />
@@ -743,7 +623,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" />
@@ -752,29 +631,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="120" 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..961ad071d4
--- /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..0be19f8a31
--- /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..d6f587464d
--- /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/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/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml
index 91db3c6b1c..435c7f4907 100644
--- a/indra/newview/skins/default/xui/da/floater_about.xml
+++ b/indra/newview/skins/default/xui/da/floater_about.xml
@@ -43,9 +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 og mange flere.
+ 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 beboere for at sikre at denne klient er den bedste version indtil nu: (under udarbejdelse)
+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.
+
+
+
+
+&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 9bda1397bc..fd1fe4aa19 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
@@ -84,9 +93,9 @@ Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel
<text name="GroupText">
Leyla Linden
</text>
- <button label="Vælg..." label_selected="Vælg..." name="Set..."/>
+ <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:
@@ -97,7 +106,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>
@@ -126,13 +135,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 land" name="Buy Land..."/>
<button label="Script Info" name="Scripts..."/>
- <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 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">
@@ -231,7 +240,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>
@@ -239,7 +248,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>
@@ -247,7 +256,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>
@@ -261,7 +270,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"/>
@@ -383,7 +392,7 @@ Kun større parceller kan vises i søgning.
<text left="4" name="at URL:">
Hjemmeside:
</text>
- <button label="Vælg..." label_selected="Vælg..." name="set_media_url"/>
+ <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:
@@ -421,6 +430,9 @@ Kun større parceller kan vises i søgning.
<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>
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 fdbfd737ba..adf96841c0 100644
--- a/indra/newview/skins/default/xui/da/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/da/floater_animation_preview.xml
@@ -141,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_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_buy_currency.xml b/indra/newview/skins/default/xui/da/floater_buy_currency.xml
index 49c2264956..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
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 57bcc7ad9d..970491b41f 100644
--- a/indra/newview/skins/default/xui/da/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/da/floater_buy_land.xml
@@ -41,7 +41,7 @@ Prøv at vælge et mindre område.
Det valgte område har ingen offentlige arealer.
</floater.string>
<floater.string name="not_owned_by_you">
- Jord, der ejes af en anden bruger er valgt.
+ Land ejet af en anden beboer valgt.
Prøv at vælge et mindre område.
</floater.string>
<floater.string name="processing">
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_customize.xml b/indra/newview/skins/default/xui/da/floater_customize.xml
index b8b4b03277..a47e0d33df 100644
--- a/indra/newview/skins/default/xui/da/floater_customize.xml
+++ b/indra/newview/skins/default/xui/da/floater_customize.xml
@@ -1,6 +1,6 @@
<?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">
+<floater name="floater customize" title="UDSEENDE">
+ <tab_container name="customize tab container">
<text label="Krops Dele" name="body_parts_placeholder">
Kropsdele
</text>
@@ -522,7 +522,7 @@
<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"/>
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
index 267a36b26c..1816144b45 100644
--- a/indra/newview/skins/default/xui/da/floater_event.xml
+++ b/indra/newview/skins/default/xui/da/floater_event.xml
@@ -9,6 +9,18 @@
<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">
@@ -21,12 +33,21 @@
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>
@@ -36,6 +57,9 @@
<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"/>
diff --git a/indra/newview/skins/default/xui/da/floater_god_tools.xml b/indra/newview/skins/default/xui/da/floater_god_tools.xml
index ea045538c5..5d3453e327 100644
--- a/indra/newview/skins/default/xui/da/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/da/floater_god_tools.xml
@@ -1,8 +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_im.xml b/indra/newview/skins/default/xui/da/floater_im.xml
index 2ef8a7ce36..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å.
@@ -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_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_moveview.xml b/indra/newview/skins/default/xui/da/floater_moveview.xml
index 258af489e7..8385924bda 100644
--- a/indra/newview/skins/default/xui/da/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/da/floater_moveview.xml
@@ -18,6 +18,15 @@
<string name="fly_back_tooltip">
Flyv baglæns (Tryk på Ned piletast eller S)
</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="turn right btn" tool_tip="Drej til højre (Tryk på højre piletast eller D)"/>
@@ -30,6 +39,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_outgoing_call.xml b/indra/newview/skins/default/xui/da/floater_outgoing_call.xml
index ef4e22dd8f..a5545668a2 100644
--- a/indra/newview/skins/default/xui/da/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/da/floater_outgoing_call.xml
@@ -28,7 +28,7 @@
Du er blevet koblet af fra [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
</text>
<text name="nearby_P2P_by_other">
- [VOICE_CHANNEL_NAME] har afsluttet opkaldet. [RECONNECT_NEARBY]
+ Dit kald er afsluttet. [RECONNECT_NEARBY]
</text>
<text name="nearby_P2P_by_agent">
Du har afsluttet opkaldet. [RECONNECT_NEARBY]
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_snapshot.xml b/indra/newview/skins/default/xui/da/floater_snapshot.xml
index 6140055d74..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="Email" name="postcard"/>
- <radio_item label="Min beholdning (L$[AMOUNT])" name="texture"/>
- <radio_item label="Gem på min computer" name="local"/>
- </radio_group>
- <text name="file_size_label">
- [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" name="more_btn" tool_tip="Avancerede muligheder"/>
- <button label="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="Billedkvalitet" 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="Snitflade" name="ui_check"/>
- <check_box label="HUDs" name="hud_check"/>
- <check_box label="Luk ikke vindue ved gemning" name="keep_open_check"/>
- <check_box label="Fastfrys (fuldt billede)" 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_tools.xml b/indra/newview/skins/default/xui/da/floater_tools.xml
index 2e35811133..b501722e92 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 name="checkbox uniform"/>
+ <text 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,8 +209,8 @@
<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>
@@ -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,8 @@
<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"/>
+ <spinner label="RotationËš"/>
+ <spinner label="Gentagelser pr. m."/>
<button label="Gem" label_selected="Gem" left_delta="62" name="button apply"/>
<text name="tex offset">
Tekstur offset
@@ -488,7 +491,7 @@ Grå = Offentligt ejet"/>
<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_tos.xml b/indra/newview/skins/default/xui/da/floater_tos.xml
index 6f61d9b310..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 følgende servicebetingelser grundigt. For at kunne logge på [SECOND_LIFE], skal du acceptere aftalen.
+ 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_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_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_world_map.xml b/indra/newview/skins/default/xui/da/floater_world_map.xml
index 7d4a81d655..898d291f1c 100644
--- a/indra/newview/skins/default/xui/da/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/da/floater_world_map.xml
@@ -5,30 +5,66 @@
Forklaring
</text>
</panel>
- <panel>
+ <panel name="layout_panel_2">
+ <button name="Show My Location" tool_tip="Centrer kortet på din avatars lokation"/>
<text name="me_label">
Mig
</text>
<text name="person_label">
Person
</text>
+ <text name="infohub_label">
+ Infohub
+ </text>
+ <text name="land_sale_label">
+ Land til salg
+ </text>
<text name="by_owner_label">
efter ejer
</text>
<text name="auction_label">
land auktion
</text>
+ <button name="Go Home" tool_tip="Teleportér til min hjemmelokation"/>
+ <text name="Home_label">
+ Hjem
+ </text>
+ <text name="events_label">
+ Events:
+ </text>
<text name="pg_label">
Generelt
</text>
+ <check_box initial_value="sandt" name="event_mature_chk"/>
<text name="mature_label">
Moderat
</text>
<text name="adult_label">
- Voksen
+ Voksent
</text>
</panel>
- <panel>
+ <panel name="layout_panel_3">
+ <text name="find_on_map_label">
+ Find på kort
+ </text>
+ </panel>
+ <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="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 name="layout_panel_5">
+ <text name="zoom_label">
+ Zoom
+ </text>
</panel>
</floater>
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..d8bd78fa23 100644
--- a/indra/newview/skins/default/xui/da/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/da/menu_attachment_self.xml
@@ -9,4 +9,5 @@
<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 6a6831c2e3..39f3e49702 100644
--- a/indra/newview/skins/default/xui/da/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/da/menu_avatar_self.xml
@@ -24,4 +24,5 @@
<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_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_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml
index 7434f2c3a2..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
@@ -11,7 +11,7 @@
<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"/>
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..aeef2ccb23 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
@@ -5,4 +5,5 @@
<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 cdfcad9b1c..0ea21dc409 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"/>
diff --git a/indra/newview/skins/default/xui/da/menu_login.xml b/indra/newview/skins/default/xui/da/menu_login.xml
index 7fc7d43c20..36e82e8bc4 100644
--- a/indra/newview/skins/default/xui/da/menu_login.xml
+++ b/indra/newview/skins/default/xui/da/menu_login.xml
@@ -6,19 +6,10 @@
</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 label="UI tests" name="UI Tests"/>
@@ -26,5 +17,7 @@
<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_object.xml b/indra/newview/skins/default/xui/da/menu_object.xml
index 232f3f64e2..c98a07e140 100644
--- a/indra/newview/skins/default/xui/da/menu_object.xml
+++ b/indra/newview/skins/default/xui/da/menu_object.xml
@@ -5,6 +5,7 @@
<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"/>
<menu_item_call label="Zoom In" name="Zoom In"/>
<context_menu label="Tag på ▶" name="Put On">
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 c2595dcb3d..02b7e8466b 100644
--- a/indra/newview/skins/default/xui/da/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/da/menu_participant_list.xml
@@ -8,6 +8,7 @@
<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="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">
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 9609b424a1..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,6 @@
<?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"/>
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 18ad7cfffa..e195ebfeed 100644
--- a/indra/newview/skins/default/xui/da/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/da/menu_viewer.xml
@@ -29,6 +29,7 @@
<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>
@@ -36,7 +37,7 @@
<menu_item_call label="Mit land" name="My Land"/>
<menu label="Vis" name="LandShow">
<menu_item_check label="Bevægelses kontrol" name="Movement Controls"/>
- <menu_item_check label="Vis kontroller" name="Camera 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"/>
@@ -64,18 +65,7 @@
<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"/>
@@ -88,10 +78,10 @@
<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">
@@ -111,7 +101,7 @@
<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>
@@ -119,8 +109,10 @@
<menu_item_call label="[SECOND_LIFE] Help" name="Second Life Help"/>
<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="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"/>
@@ -128,7 +120,7 @@
<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"/>
@@ -142,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"/>
@@ -168,7 +159,7 @@
<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_call label="Tøm gruppe cache" name="ClearGroupCache"/>
<menu_item_check label="Muse udjævning" name="Mouse Smoothing"/>
<menu label="Shortcuts" name="Shortcuts">
diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml
index 9193bd43e8..afccc1e904 100644
--- a/indra/newview/skins/default/xui/da/notifications.xml
+++ b/indra/newview/skins/default/xui/da/notifications.xml
@@ -107,7 +107,7 @@ Vælg kun en genstand, og prøv igen.
</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="Ja"/>
+ <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.
@@ -224,11 +224,14 @@ Er du sikker på at du vil fortsætte?
Ikke nok penge til at oprette annonce.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <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">
@@ -243,9 +246,9 @@ Indtast venligst navn på region i Start lokation feltet eller vælg &quot;Min s
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="UnsupportedHardware">
- Bare så du ved det, din computer opfylder ikke minimumskravene til [APP_NAME]. Du kan opleve dårlig hastighed. Desværre kan [SUPPORT_SITE] ikke give teknisk support til ikke-supporterede konfigurationer.
-MINSPECS
-Besøg [_URL] for mere information?
+ 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">
@@ -391,6 +394,16 @@ 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="ErrorMessage">
<usetemplate name="okbutton" yestext="OK"/>
</notification>
@@ -525,6 +538,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>
@@ -547,6 +564,15 @@ Chat og personlige beskeder vil blive skjult. Personlige beskeder vil få din &a
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">
<input name="message">
@@ -556,6 +582,9 @@ 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"/>
@@ -568,6 +597,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.
@@ -596,6 +636,9 @@ Du kan klikke på &apos;Ændre præference&apos; for at ændre din indholdsratin
<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.
@@ -790,6 +833,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>
@@ -815,6 +861,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>
@@ -1157,9 +1208,9 @@ 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"/>
@@ -1177,9 +1228,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"/>
@@ -1233,6 +1286,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>
@@ -1273,14 +1329,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="BuyLindenDollarSuccess">
Tak for din betaling!
@@ -1407,7 +1455,7 @@ De vil blive blokeret nogle få sekunder af sikkerhedsmæssige årsager.
</notification>
<notification name="ConfirmCloseAll">
Er du sikker på at du vil lukke alle personlige samtaler (IM)?
- <usetemplate name="okcancelignore" notext="Annullér" yestext="OK"/>
+ <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.
@@ -1436,6 +1484,12 @@ 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="AvatarRezNotification">
+ Avatar &apos;[NAME]&apos; rezzed på [TIME] sekunder.
+ </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_classified_info.xml b/indra/newview/skins/default/xui/da/panel_classified_info.xml
index 6eba024981..28f8936457 100644
--- a/indra/newview/skins/default/xui/da/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/da/panel_classified_info.xml
@@ -3,16 +3,46 @@
<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_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]"/>
- <check_box label="Forny automatisk hver uge" name="auto_renew"/>
- <text_editor name="price_for_listing" tool_tip="Pris for optagelse."/>
- <text_editor name="classified_desc" value="[description]"/>
+ <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_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_shape.xml b/indra/newview/skins/default/xui/da/panel_edit_shape.xml
index 19c27748ca..1c8567d27c 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_shape.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_shape.xml
@@ -9,15 +9,17 @@
<radio_item label="Mand" name="radio2"/>
</radio_group>
</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 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>
</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_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..4afb7ba45c 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml
@@ -94,6 +94,11 @@
<panel label="Trøje" name="wearable_type_panel">
<text name="description_text" value="Kropsbygning:"/>
</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"/>
<button label="Vend tilbage" name="revert_button"/>
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 becb5ab70a..3079a23d20 100644
--- a/indra/newview/skins/default/xui/da/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/da/panel_group_general.xml
@@ -45,8 +45,11 @@
<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_im_control_panel.xml b/indra/newview/skins/default/xui/da/panel_im_control_panel.xml
index 1ba6b8b97f..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
@@ -13,14 +13,14 @@
<layout_panel name="share_btn_panel">
<button label="Del" name="share_btn"/>
</layout_panel>
- <layout_panel name="share_btn_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="Forlad opkald" name="end_call_btn"/>
+ <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"/>
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_landmarks.xml b/indra/newview/skins/default/xui/da/panel_landmarks.xml
index 8adce2c819..9a0a2fb207 100644
--- a/indra/newview/skins/default/xui/da/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/da/panel_landmarks.xml
@@ -1,7 +1,7 @@
<?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_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"/>
diff --git a/indra/newview/skins/default/xui/da/panel_login.xml b/indra/newview/skins/default/xui/da/panel_login.xml
index 9276ff3a09..1e60174909 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>
@@ -12,20 +15,31 @@
Fornavn:
</text>
<line_editor label="Fornavn" name="first_name_edit" tool_tip="[SECOND_LIFE] First Name"/>
+ <text name="last_name_text">
+ Efternavn:
+ </text>
<line_editor label="Efternavn" name="last_name_edit" tool_tip="[SECOND_LIFE] Last Name"/>
+ <text name="password_text">
+ Password:
+ </text>
<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..16bd22c21a 100644
--- a/indra/newview/skins/default/xui/da/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/da/panel_main_inventory.xml
@@ -1,18 +1,14 @@
<?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>
- <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"/>
- </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>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] Genstande [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ Genstande:
+ </text>
<menu_bar name="Inventory Menu">
<menu label="Filer" name="File">
<menu_item_call label="Ã…ben" name="Open"/>
@@ -61,4 +57,14 @@
<menu_item_check label="System-mapper i toppen" name="System Folders To Top"/>
</menu>
</menu_bar>
+ <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"/>
+ </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>
</panel>
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_navigation_bar.xml b/indra/newview/skins/default/xui/da/panel_navigation_bar.xml
index 79f7e81b35..2ee87433a4 100644
--- a/indra/newview/skins/default/xui/da/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/da/panel_navigation_bar.xml
@@ -11,7 +11,7 @@
</panel>
<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!">
- Favorit bar
+ Favoritter
</label>
<chevron_button name="&gt;&gt;" tool_tip="Søg mere af mine favoritter"/>
</favorites_bar>
diff --git a/indra/newview/skins/default/xui/da/panel_nearby_media.xml b/indra/newview/skins/default/xui/da/panel_nearby_media.xml
index 32905a2deb..95bfc89f20 100644
--- a/indra/newview/skins/default/xui/da/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/da/panel_nearby_media.xml
@@ -1,5 +1,8 @@
<?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>
@@ -16,13 +19,15 @@
<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_less_btn" tool_tip="Avanceret opsætning"/>
+ <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"/>
@@ -40,16 +45,16 @@
<button name="play_btn" tool_tip="Afspil valgte medie"/>
</layout_panel>
<layout_panel name="pause">
- <button name="pause_btn" tool_tip="Pause valgte medie"/>
+ <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="Volumen for valgte medie"/>
+ <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 for lyd for valgte medie"/>
+ <button name="mute_btn" tool_tip="Sluk lyd fra valgte medie"/>
</layout_panel>
<layout_panel name="zoom">
- <button name="zoom_btn" tool_tip="Zoom ind til valgte medie"/>
+ <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"/>
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..de68366610
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_outfit_edit.xml
@@ -0,0 +1,48 @@
+<?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"/>
+ <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="Retter..."/>
+ <text name="curr_outfit_name" value="[Current Outfit]"/>
+ </panel>
+ </panel>
+ <layout_stack name="im_panels">
+ <layout_panel label="IM kontrolpanel" name="outfit_wearables_panel">
+ <scroll_list name="look_items_list">
+ <scroll_list.columns label="Se genstand" name="look_item"/>
+ <scroll_list.columns label="Sorter genstande i sæt" name="look_item_sort"/>
+ </scroll_list>
+ <panel label="bottom_panel" name="edit_panel"/>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel">
+ <filter_editor label="Filter" name="look_item_filter"/>
+ <layout_stack name="filter_panels">
+ <layout_panel label="IM kontrolpanel" name="filter_button_panel">
+ <text name="add_to_outfit_label" value="Tilføj til sæt:"/>
+ <button label="O" name="filter_button"/>
+ </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 df00cfb2eb..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,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Ting" name="Outfits">
<tab_container name="appearance_tabs">
- <inventory_panel label="MINE SÆT" name="outfitslist_tab"/>
+ <panel label="MINE SÆT" name="outfitslist_tab"/>
<inventory_panel label="HAR PÃ…" name="cof_tab"/>
</tab_container>
<panel name="bottom_panel">
@@ -9,6 +9,6 @@
<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="M" name="look_edit_btn"/>
+ <button label="Redigér sæt" name="edit_current_outfit_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_people.xml b/indra/newview/skins/default/xui/da/panel_people.xml
index ecfac67b1a..db72125b84 100644
--- a/indra/newview/skins/default/xui/da/panel_people.xml
+++ b/indra/newview/skins/default/xui/da/panel_people.xml
@@ -1,12 +1,23 @@
<?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 hvad du ledte efter? Prøv [secondlife:///app/search/people 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 hvad du ledte efter? Prøv [secondlife:///app/search/people Search]."/>
<string name="no_friends_online" value="Ingen venner online"/>
<string name="no_friends" value="Ingen venner"/>
+ <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 hvad du ledte efter? Prøv [secondlife:///app/search/people 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 hvad du ledte efter? Prøv [secondlife:///app/search/groups 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">
@@ -25,10 +36,6 @@
<button name="add_btn" tool_tip="Tilbyd venskab til en beboer"/>
<button name="del_btn" tool_tip="Fjern valgte person fra din venneliste"/>
</panel>
- <text name="no_friends_msg">
- For at tilføje venner prøv [secondlife:///app/search/people global search] eller klik på en bruger for at tilføje dem som ven.
-Hvis du leder efter beboere at være sammen med, [secondlife:///app/worldmap prøv kortet].
- </text>
</panel>
<panel label="MINE GRUPPER" name="groups_panel">
<panel label="bottom_panel" name="bottom_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 c1ed95f580..05ef22328f 100644
--- a/indra/newview/skins/default/xui/da/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/da/panel_place_profile.xml
@@ -48,10 +48,63 @@
<text name="owner_label" value="Ejer:"/>
<text name="maturity_value" value="ukendt"/>
<accordion name="advanced_info_accordion">
- <accordion_tab name="parcel_characteristics_tab" title="Parcel"/>
- <accordion_tab name="region_information_tab" title="Region"/>
- <accordion_tab name="estate_information_tab" title="Estate"/>
- <accordion_tab name="sales_tab" title="Til salg"/>
+ <accordion_tab name="parcel_characteristics_tab" title="Parcel">
+ <panel name="parcel_characteristics_panel">
+ <text name="rating_label" value="Rating:"/>
+ <text name="rating_value" value="ukendt"/>
+ <text name="voice_label" value="Stemme:"/>
+ <text name="voice_value" value="Til"/>
+ <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="Bygge:"/>
+ <text name="build_value" value="Til"/>
+ <text name="scripts_label" value="Scripts:"/>
+ <text name="scripts_value" value="Til"/>
+ <text name="damage_label" value="Skade:"/>
+ <text name="damage_value" value="Fra"/>
+ <button label="Om land" 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="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 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:"/>
+ <text name="covenant_label" value="Regler:"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="Til salg">
+ <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="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>
+ </accordion_tab>
</accordion>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/da/panel_places.xml b/indra/newview/skins/default/xui/da/panel_places.xml
index 3ac4ebaae9..c06176f994 100644
--- a/indra/newview/skins/default/xui/da/panel_places.xml
+++ b/indra/newview/skins/default/xui/da/panel_places.xml
@@ -11,5 +11,6 @@
<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 30665dfa0e..4d505db30e 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml
@@ -3,6 +3,9 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
+ <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">
@@ -15,8 +18,11 @@
<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="Talebobler" name="bubble_text_chat"/>
- <slider label="Gennemsigtighed" name="bubble_chat_opacity"/>
+ <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="Chat" name="0"/>
@@ -26,4 +32,5 @@
<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" 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_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
index 3345bceff7..df97193598 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" 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,6 +45,12 @@
</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"/>
+ <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"/>
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 f2c59f3d81..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">
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 279e288096..8202c78947 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_setup.xml
@@ -34,9 +34,12 @@
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]." value="0"/>
<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="sand" label="Aktivér plugins" name="browser_plugins_enabled"/>
+ <check_box initial_value="sand" label="Acceptér cookies" name="cookies_enabled"/>
+ <check_box initial_value="sand" label="Aktivér Javascript" name="browser_javascript_enabled"/>
<check_box initial_value="false" label="Aktivér web proxy" name="web_proxy_enabled"/>
<text name="Proxy location">
Proxy placering:
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 564d8e6665..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>
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 c21fd9db37..65948ce481 100644
--- a/indra/newview/skins/default/xui/da/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/da/panel_region_estate.xml
@@ -39,7 +39,7 @@
</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
index 467684f712..f3c32d6169 100644
--- a/indra/newview/skins/default/xui/da/panel_region_general_layout.xml
+++ b/indra/newview/skins/default/xui/da/panel_region_general_layout.xml
@@ -36,8 +36,8 @@
<combo_box.item label="Generel" name="PG"/>
</combo_box>
<button label="Gem" name="apply_btn"/>
- <button label="Send en beboer hjem ..." name="kick_btn"/>
- <button label="Send alle beboere hjem...&quot;" 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_texture.xml b/indra/newview/skins/default/xui/da/panel_region_texture.xml
index 8e324ab777..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"/>
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 ec430d6fd4..66c3e69904 100644
--- a/indra/newview/skins/default/xui/da/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/da/panel_side_tray.xml
@@ -3,27 +3,27 @@
partially on screen to hold tab buttons. -->
<side_tray name="sidebar">
<sidetray_tab description="Ã…bn/luk sidebar" name="sidebar_openclose" tab_title="Ã…bn/luk sidebar"/>
- <sidetray_tab description="Hjem." name="sidebar_home" tab_title="Home">
+ <sidetray_tab description="Hjem." name="sidebar_home" tab_title="Hjem">
<panel label="hjem" name="panel_home"/>
</sidetray_tab>
- <sidetray_tab description="Redigér din profile og favoritter." name="sidebar_me" tab_title="My Profile">
+ <sidetray_tab description="Redigér din profile og favoritter." name="sidebar_me" tab_title="Min profil">
<panel_container name="panel_container">
<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="People">
+ <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" tab_title="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="Browse din beholdning." name="sidebar_inventory" tab_title="My 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="My Appearance">
- <panel label="Redigér fremtoning" name="sidepanel_appearance"/>
+ <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_teleport_history.xml b/indra/newview/skins/default/xui/da/panel_teleport_history.xml
index a1859b64d8..8a01659ffa 100644
--- a/indra/newview/skins/default/xui/da/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/da/panel_teleport_history.xml
@@ -13,6 +13,6 @@
<accordion_tab name="6_months_and_older" title="6 måneder eller ældre"/>
</accordion>
<panel name="bottom_panel">
- <button name="gear_btn" tool_tip="Vi flere valgmuligheder"/>
+ <button name="gear_btn" tool_tip="Vis flere valgmuligheder"/>
</panel>
</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_inventory.xml b/indra/newview/skins/default/xui/da/sidepanel_inventory.xml
index ae029f5939..9a2a348f58 100644
--- a/indra/newview/skins/default/xui/da/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/da/sidepanel_inventory.xml
@@ -3,6 +3,7 @@
<panel label="" name="sidepanel__inventory_panel">
<panel name="button_panel">
<button label="Profil" name="info_btn"/>
+ <button label="Del" name="share_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 77db828c20..701a59bade 100644
--- a/indra/newview/skins/default/xui/da/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml
@@ -42,27 +42,27 @@
<text name="perm_modify">
Du kan:
</text>
- <check_box label="Redigér" name="CheckOwnerModify"/>
- <check_box label="Kopi" name="CheckOwnerCopy"/>
- <check_box label="Giv væk" name="CheckOwnerTransfer"/>
+ <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="Kopi" name="CheckEveryoneCopy"/>
+ <check_box label="Kopiere" name="CheckEveryoneCopy"/>
<text name="GroupLabel">
Gruppe:
</text>
- <check_box label="Del" 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."/>
+ <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="Kopi" name="CheckNextOwnerCopy"/>
- <check_box label="Giv væk" name="CheckNextOwnerTransfer" tool_tip="Næste ejer kan give væk eller sælge dette objekt"/>
+ <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: L$" name="Edit Cost"/>
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 add2fa3c73..bec97734e4 100644
--- a/indra/newview/skins/default/xui/da/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/da/sidepanel_task_info.xml
@@ -38,16 +38,41 @@
</panel.string>
<text name="title" value="Objekt profil"/>
<text name="where" value="(verden)"/>
- <panel label="">
+ <panel label="" name="properties_panel">
+ <text name="Name:">
+ Navn:
+ </text>
+ <text name="Description:">
+ Beskrivelse:
+ </text>
<text name="CreatorNameLabel">
- Skaber
+ Skaber:
</text>
<text name="Creator Name">
Erica Linden
</text>
+ <text name="Owner:">
+ Ejer:
+ </text>
+ <text name="Owner Name">
+ Erica Linden
+ </text>
<text name="Group_label">
Gruppe:
</text>
+ <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 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="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 objekt" name="Payobject"/>
+ <combo_box.item label="Ã…bne" name="Open"/>
+ </combo_box>
<panel name="perms_inv">
<text name="perm_modify">
Du kan redigere dette objekt
@@ -55,31 +80,38 @@
<text name="Anyone can:">
Enhver:
</text>
- <check_box label="Kopi" name="checkbox allow everyone copy"/>
- <check_box label="Flyt" name="checkbox allow everyone move"/>
+ <check_box label="Kopiere" name="checkbox allow everyone copy"/>
+ <check_box label="Flytte" name="checkbox allow everyone move"/>
<text name="GroupLabel">
Gruppe:
</text>
- <check_box label="Del" name="checkbox share with group" tool_tip="Tillad alle medlemmer i den aktive gruppe at dele dine &apos;rediger&apos; rettigheder for dette objekt. Du skal dedikere for at åbne for rolle begrænsninger."/>
+ <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="Kopi" name="checkbox next owner can copy"/>
- <check_box label="Give væk" name="checkbox next owner can transfer" tool_tip="Næste ejer kan give væk eller sælge objekt"/>
+ <check_box label="Kopiere" name="checkbox next owner can copy"/>
+ <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:">
- B:
+ S:
</text>
<text name="O:">
- O:
+ E:
</text>
<text name="G:">
G:
</text>
<text name="E:">
- E:
+ A:
</text>
<text name="N:">
N:
@@ -92,5 +124,6 @@
<button label="Ã…ben" name="open_btn"/>
<button label="Betal" name="pay_btn"/>
<button label="Køb" name="buy_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 412f946acc..bd5ab62be9 100644
--- a/indra/newview/skins/default/xui/da/strings.xml
+++ b/indra/newview/skins/default/xui/da/strings.xml
@@ -14,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.
@@ -41,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)...
@@ -76,12 +91,33 @@
<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>
@@ -136,6 +172,24 @@
<string name="TooltipAgentUrl">
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
</string>
@@ -161,18 +215,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 (⌘W)
</string>
<string name="BUTTON_CLOSE_WIN">
Luk (Ctrl+W)
</string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Luk
+ </string>
<string name="BUTTON_RESTORE">
Gendan
</string>
@@ -212,6 +288,9 @@
<string name="GroupNameNone">
(ingen)
</string>
+ <string name="AvalineCaller">
+ Avaline opkalder [ORDER]
+ </string>
<string name="AssetErrorNone">
Ingen fejl
</string>
@@ -317,6 +396,9 @@
<string name="symbolic link">
link
</string>
+ <string name="symbolic folder link">
+ link til mappe
+ </string>
<string name="AvatarAway">
Væk
</string>
@@ -734,6 +816,9 @@
<string name="invalid">
ugyldig
</string>
+ <string name="NewWearable">
+ Ny [WEARABLE_ITEM]
+ </string>
<string name="next">
Næste
</string>
@@ -765,7 +850,7 @@
Teleport tilbud
</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)
@@ -801,7 +886,7 @@
Tryk ESC for at skift til normalt udsyn
</string>
<string name="InventoryNoMatchingItems">
- Ingen matchende genstande fundet i beholdning. Prøv evt. [secondlife:///app/search/groups &quot;Search&quot;].
+ Fandt du ikke hvad du ledte efter. Prøv [secondlife:///app/search/all Search].
</string>
<string name="FavoritesNoMatchingItems">
Træk et landemærke hertil for at tilføje den som favorit.
@@ -813,8 +898,8 @@
<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>
@@ -822,6 +907,7 @@
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 : "/>
@@ -915,6 +1001,9 @@
<string name="InvFolder My Outfits">
Mine sæt
</string>
+ <string name="InvFolder Accessories">
+ Tilbehør
+ </string>
<string name="InvFolder Friends">
Venner
</string>
@@ -1432,6 +1521,12 @@
<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)
</string>
@@ -1450,9 +1545,7 @@
<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">
@@ -1546,7 +1639,10 @@
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]
@@ -1703,7 +1799,7 @@ Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
Enhver
</string>
<string name="You">
- Dig
+ Du
</string>
<string name="Multiple Media">
Flere medietyper
@@ -2512,7 +2608,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
@@ -3126,6 +3222,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>
@@ -3156,6 +3261,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>
@@ -3183,11 +3294,14 @@ 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="started_call">
- Startet et stemme opkald
+ startede et stemme opkald
</string>
<string name="joined_call">
- Tilsluttet stemme opkaldet
+ tilsluttede stemme opkald
</string>
<string name="ringing-im">
Tilslutter stemme opkald...
@@ -3264,4 +3378,135 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<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="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 c19f98516d..89f9f87043 100644
--- a/indra/newview/skins/default/xui/de/floater_about.xml
+++ b/indra/newview/skins/default/xui/de/floater_about.xml
@@ -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">
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 186c2932c3..3026ff64b2 100644
--- a/indra/newview/skins/default/xui/de/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_about_land.xml
@@ -24,7 +24,7 @@
<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 Einwohner
+ Nur neue Benutzer
</panel.string>
<panel.string name="anyone">
Jeder
@@ -151,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
@@ -171,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
@@ -266,7 +264,7 @@ werden.
<text left="204" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text left="4" name="Autoreturn" width="410">
+ <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"/>
@@ -278,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" width="80"/>
- <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">
@@ -337,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"/>
@@ -355,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"/>
@@ -377,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" right="-88" 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:
@@ -396,7 +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"/>
+ <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:
@@ -436,15 +434,18 @@ 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 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
@@ -453,8 +454,8 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<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 0d55ea7413..82a4a51d07 100644
--- a/indra/newview/skins/default/xui/de/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_animation_preview.xml
@@ -142,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"/>
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_buy_currency.xml b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
index d0d3628448..f978b24d0d 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
@@ -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
@@ -59,9 +59,8 @@
</text>
<button label="Jetzt kaufen" name="buy_btn"/>
<button label="Abbrechen" name="cancel_btn"/>
- <text name="info_cannot_buy" left="160" width="200" height="40">
- Kauf nicht
-möglich
+ <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 f380393163..5708a3f80a 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_land.xml
@@ -41,8 +41,8 @@ Verkleinern Sie Ihre Auswahl.
Das ausgewählte Land beinhaltet kein öffentliches Land.
</floater.string>
<floater.string name="not_owned_by_you">
- Sie haben Land ausgewählt, das einem anderen Einwohner gehört.
-Wählen Sie ein kleineres Gebiet aus.
+ Sie haben Land ausgewählt, das einer anderen Person gehört.
+Verkleinern Sie Ihre Auswahl.
</floater.string>
<floater.string name="processing">
Kauf wird abgewickelt...
@@ -140,13 +140,13 @@ unterstützt [AMOUNT2] Objekte
(unbekannt)
</text>
<text name="estate_name_label">
- Grundstück:
+ Grundbesitz:
</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="680" left_delta="140" name="estate_owner_text">
(unbekannt)
@@ -161,7 +161,7 @@ unterstützt [AMOUNT2] Objekte
Darft oder darf nicht zusammengelegt/unterteilt werden.
</text>
<text left="410" name="covenant_text">
- Sie müssen dem Grundstücksvertrag zustimmen:
+ Sie müssen dem Grundbesitzvertrag zustimmen:
</text>
<text left="470" name="covenant_timestamp_text"/>
<text_editor left="470" name="covenant_editor">
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_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 f284d7cd6b..3651577797 100644
--- a/indra/newview/skins/default/xui/de/floater_customize.xml
+++ b/indra/newview/skins/default/xui/de/floater_customize.xml
@@ -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">
@@ -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">
@@ -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">
@@ -159,7 +159,7 @@
<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]
@@ -192,7 +192,7 @@
<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]
@@ -249,7 +249,7 @@
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
<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">
@@ -282,7 +282,7 @@
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
<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">
@@ -316,7 +316,7 @@
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
<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">
@@ -349,7 +349,7 @@
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
<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">
@@ -382,7 +382,7 @@
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
<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">
@@ -415,7 +415,7 @@
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
<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">
@@ -448,7 +448,7 @@
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
<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="Tätowierung" name="Tattoo">
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 9baf30fb53..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" label_width="100" width="66"/>
+ <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" label_width="100" width="66"/>
- <spinner label="Sek." name="WLLengthOfDaySec" label_width="100" width="66"/>
+ <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_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 108baee4a4..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,15 +2,14 @@
<floater name="godtools floater" title="GOTT-WERKZEUGE">
<tab_container name="GodTools Tabs">
<panel label="Raster" name="grid">
- <button label="Alle Einwohner hinauswerfen" label_selected="Alle Einwohner 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:
+ <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 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."/>
@@ -21,12 +20,12 @@
<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>
@@ -52,8 +51,8 @@
<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_image_preview.xml b/indra/newview/skins/default/xui/de/floater_image_preview.xml
index fd675f8808..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.
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 5372b8387e..81079a3c52 100644
--- a/indra/newview/skins/default/xui/de/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/de/floater_outgoing_call.xml
@@ -28,7 +28,7 @@
Die Verbindung zu [VOICE_CHANNEL_NAME] wurde abgebrochen. [RECONNECT_NEARBY]
</text>
<text name="nearby_P2P_by_other">
- [VOICE_CHANNEL_NAME] hat den Anruf beendet. [RECONNECT_NEARBY]
+ Ihr Anfruf wurde beendet. [RECONNECT_NEARBY]
</text>
<text name="nearby_P2P_by_agent">
Sie haben das Gespräch beendet. [RECONNECT_NEARBY]
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_snapshot.xml b/indra/newview/skins/default/xui/de/floater_snapshot.xml
index 9ee50c7c5c..4c417710bd 100644
--- a/indra/newview/skins/default/xui/de/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/de/floater_snapshot.xml
@@ -1,79 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="FOTO-VORSCHAU">
- <text name="type_label">
- Zweck des Fotos
- </text>
- <radio_group label="Fototyp" name="snapshot_type_radio">
- <radio_item label="Emailen" 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="66">
- 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="Oberfläche" 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"/>
+ <button label="Foto freigeben" name="share"/>
+ <button label="Ins Internet stellen" name="share_to_web"/>
+ <button label="Objekt in meinem Inventar speichern" name="save_to_inventory"/>
+ <button label="Foto speichern" name="save"/>
+ <button label="Foto per E-Mail senden" name="share_to_email"/>
+ <button label="Auf meinem Computer speichern" name="save_to_computer"/>
+ <button label="Als Profilbild festlegen" name="set_profile_pic"/>
+ <button label="Zurück" name="cancel"/>
</floater>
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 d7db97722c..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,5 +1,5 @@
<?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">
GESPRÄCHE
</string>
diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml
index 7091e35a6e..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
@@ -67,10 +67,13 @@
<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" top_pad="10"/>
- <combo_box name="combobox grid mode" tool_tip="Wählen Sie das Rasterlineal aus, um das Objekt zu positionieren.">
+ <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"/>
@@ -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>
@@ -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_world_map.xml b/indra/newview/skins/default/xui/de/floater_world_map.xml
index 008a9d63b7..a1f41f53ad 100644
--- a/indra/newview/skins/default/xui/de/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/de/floater_world_map.xml
@@ -30,7 +30,7 @@
</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:
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 d234443fae..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,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="Bezahlen" name="Pay..."/>
<menu_item_call label="Objektprofil" name="Object Inspect"/>
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 05eade1d34..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="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 3a116b84a2..d310d10ea5 100644
--- a/indra/newview/skins/default/xui/de/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/de/menu_avatar_self.xml
@@ -24,4 +24,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_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_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml
index 6f003dc9a5..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,7 +11,7 @@
<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="Bezahlen" name="pay"/>
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 a0625d88a8..306ef19de3 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory.xml
@@ -1,5 +1,6 @@
<?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="Abspielen" name="Task Play"/>
@@ -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"/>
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_participant_list.xml b/indra/newview/skins/default/xui/de/menu_participant_list.xml
index 5ca4eaaa50..ca0d9f8c2d 100644
--- a/indra/newview/skins/default/xui/de/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/de/menu_participant_list.xml
@@ -8,6 +8,7 @@
<menu_item_call label="Anrufen" name="Call"/>
<menu_item_call label="Teilen" name="Share"/>
<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_profile_overflow.xml b/indra/newview/skins/default/xui/de/menu_profile_overflow.xml
index 03bc19aa3f..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,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="profile_overflow_menu">
+ <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"/>
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..70bca077ab
--- /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="Als neue Datei speichern" 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 c628cb4b61..c416ebd7c1 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -31,8 +31,9 @@
<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"/>
@@ -53,7 +54,7 @@
<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>
@@ -66,17 +67,6 @@
<menu_item_call label="Erstellen" name="Create"/>
<menu_item_call label="Land" 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>
<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"/>
@@ -124,6 +114,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 +136,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"/>
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 2db126bcb0..aa1ee71c3f 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -107,10 +107,10 @@ Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
</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="OK"/>
+ <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>
@@ -359,7 +359,7 @@ Sind Sie sicher, dass Sie fortfahren wollen?
<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">
@@ -937,6 +937,16 @@ 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 name="RemoveFromFriends">
Möchten Sie [FIRST_NAME] [LAST_NAME] aus Ihrer Freundesliste entfernen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
@@ -1189,7 +1199,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.
@@ -1314,8 +1324,8 @@ Diese Gruppe verlassen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ConfirmKick">
- Möchten Sie WIRKLICH alle Einwohner aus dem Grid werfen?
- <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Alle Einwohner hinauswerfen"/>
+ Möchten Sie WIRKLICH alle Benutzer aus dem Grid werfen?
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Alle Benutzer hinauswerfen"/>
</notification>
<notification name="MuteLinden">
Lindens können nicht ignoriert werden.
@@ -1355,7 +1365,7 @@ Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachricht
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="KickUser">
- Beim Hinauswerfen dieses Einwohners welche Meldung anzeigen?
+ Beim Hinauswerfen dieses Benutzers welche Meldung anzeigen?
<form name="form">
<input name="message">
Sie wurden von einem Administrator abgemeldet.
@@ -1375,7 +1385,7 @@ Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachricht
</form>
</notification>
<notification name="FreezeUser">
- Beim Einfrieren dieses Einwohners welche Meldung anzeigen?
+ Beim Einfrieren dieses Benutzers welche Meldung anzeigen?
<form name="form">
<input name="message">
Sie wurden eingefroren. Bewegen oder Chatten ist nicht mehr möglich. Ein Administrator wird sich über IM an Sie wenden
@@ -1385,7 +1395,7 @@ Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachricht
</form>
</notification>
<notification name="UnFreezeUser">
- Beim Auftauen dieses Einwohners welche Meldung anzeigen?
+ Beim Auftauen dieses Benutzers welche Meldung anzeigen?
<form name="form">
<input name="message">
Sie sind nicht mehr eingefroren.
@@ -1405,7 +1415,7 @@ Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachricht
</form>
</notification>
<notification name="OfferTeleportFromGod">
- Einwohner an Ihrem Standort herbeirufen?
+ Einwohner zu Ihrem Standort einladen?
<form name="form">
<input name="message">
Triff mich in [REGION]
@@ -1426,67 +1436,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-Grid, Orientation, 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 hat EXTREME KONSEQUENZEN und wirkt sich auf die Einwohner aus! Auf dem Mainland kann dies zu Veränderungen in Tausenden von Regionen und zu Problemen mit dem Spaceserver führen!
+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">
@@ -1517,6 +1531,9 @@ Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstuf
<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.
@@ -1570,14 +1587,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.
@@ -1725,7 +1742,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">
@@ -1932,6 +1949,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>
@@ -1960,6 +1980,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>
@@ -2287,7 +2312,7 @@ Versuchen Sie es in einigen Minuten erneut.
<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">
@@ -2304,9 +2329,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"/>
@@ -2324,11 +2349,11 @@ 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"/>
@@ -2391,6 +2416,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>
@@ -2432,14 +2460,6 @@ Anfrage gestatten?
<button name="Ignore" text="Ignorieren"/>
</form>
</notification>
- <notification name="ScriptToast">
- [FIRST] [LAST]s &apos;[TITLE]&apos; fordert Eingaben vom Einwohner 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.
@@ -2596,6 +2616,12 @@ 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">
+ Artikel aus Inventar auf eine Person im Fenster „Einwohner auswählen“ ziehen.
+ </notification>
+ <notification name="AvatarRezNotification">
+ Avatar &apos;[NAME]&apos; wurde in [TIME] Sekunden gerezzt.
+ </notification>
<global name="UnsupportedCPU">
- Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen.
</global>
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_bottomtray.xml b/indra/newview/skins/default/xui/de/panel_bottomtray.xml
index d3f89b0ad3..d52b8dcf4d 100644
--- a/indra/newview/skins/default/xui/de/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/de/panel_bottomtray.xml
@@ -9,7 +9,7 @@
<layout_stack name="toolbar_stack">
<layout_panel name="speak_panel">
<talk_button name="talk">
- <speak_button label="Sprechen" label_selected="Sprechen" name="speak_btn"/>
+ <speak_button label="Sprechen" label_selected="Sprechen" name="speak_btn" halign="right" />
</talk_button>
</layout_panel>
<layout_panel name="gesture_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 6480b640cd..ac1cd7ba88 100644
--- a/indra/newview/skins/default/xui/de/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/de/panel_classified_info.xml
@@ -26,7 +26,7 @@
<panel name="scroll_content_panel">
<text_editor name="classified_name" value="[name]"/>
<text name="classified_location_label" value="Standort:"/>
- <text_editor name="classified_location" value="[wird geladen...]"/>
+ <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:"/>
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 950c9023fe..8fe76f6225 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_jacket.xml
@@ -5,7 +5,9 @@
<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 0cb14177af..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>
@@ -22,7 +25,7 @@
</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_shape.xml b/indra/newview/skins/default/xui/de/panel_edit_shape.xml
index 37be3c1d90..393a586903 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_shape.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_shape.xml
@@ -9,15 +9,17 @@
<radio_item label="Männlich" name="radio2"/>
</radio_group>
</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 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>
</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 90b06a29bc..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-Up"/>
- <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_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..17a632b46e 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_wearable.xml
@@ -94,6 +94,11 @@
<panel label="Hemd" name="wearable_type_panel">
<text name="description_text" value="Form:"/>
</panel>
+ <panel label="gear_buttom_panel" name="gear_buttom_panel">
+ <button name="friends_viewsort_btn" tool_tip="Optionen"/>
+ <button name="add_btn" tool_tip="TODO"/>
+ <button name="del_btn" tool_tip="TODO"/>
+ </panel>
<panel name="button_panel">
<button label="Speichern unter" name="save_as_button"/>
<button label="Zurücksetzen" name="revert_button"/>
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 f300679e16..9d4301de73 100644
--- a/indra/newview/skins/default/xui/de/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_general.xml
@@ -47,8 +47,11 @@ Bewegen Sie die Maus über die Optionen, um weitere Informationen anzuzeigen.
<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."/>
<combo_box name="group_mature_check" tool_tip="Legt fest, ob Ihre Gruppeninformation moderate Inhalte enthält">
- <combo_box.item label="Genereller 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>
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_main_inventory.xml b/indra/newview/skins/default/xui/de/panel_main_inventory.xml
index 7d57a3b3f2..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"/>
@@ -61,4 +57,14 @@
<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_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_nearby_media.xml b/indra/newview/skins/default/xui/de/panel_nearby_media.xml
index 2d97a25fa9..e633ae1dde 100644
--- a/indra/newview/skins/default/xui/de/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/de/panel_nearby_media.xml
@@ -1,5 +1,8 @@
<?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>
@@ -13,16 +16,18 @@
(wird abgespielt)
</string>
<panel name="minimized_controls">
- <button label="Alle stoppen" name="all_nearby_media_disable_btn" tool_tip="Alle Medien in der Nähe ausschalten"/>
- <button label="Alle starten" name="all_nearby_media_enable_btn" tool_tip="Alle Medien in der Nähe einschalten"/>
+ <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_less_btn" tool_tip="Erweiterte Steuerung"/>
+ <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"/>
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..5ff088d41c
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_outfit_edit.xml
@@ -0,0 +1,48 @@
+<?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"/>
+ <button label="Bearbeiten" name="edit_wearable_btn"/>
+ <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">
+ <scroll_list name="look_items_list">
+ <scroll_list.columns label="Look-Artikel" name="look_item"/>
+ <scroll_list.columns label="Outfit-Artikel sortieren" name="look_item_sort"/>
+ </scroll_list>
+ <panel label="bottom_panel" name="edit_panel"/>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel">
+ <filter_editor label="Filter" name="look_item_filter"/>
+ <layout_stack name="filter_panels">
+ <layout_panel label="IM Steuerkonsole" name="filter_button_panel">
+ <text name="add_to_outfit_label" value="Zum Outfit hinzufügen:"/>
+ <button label="O" name="filter_button"/>
+ </layout_panel>
+ </layout_stack>
+ <panel label="add_wearables_button_bar" name="add_wearables_button_bar">
+ <button label="O" name="folder_view_btn"/>
+ <button label="L" name="list_view_btn"/>
+ </panel>
+ </layout_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 54c56992fd..f695d67d1b 100644
--- a/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml
@@ -1,7 +1,7 @@
<?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"/>
+ <panel label="MEINE OUTFITS" name="outfitslist_tab"/>
<inventory_panel label="AKTUELLES OUTFIT" name="cof_tab"/>
</tab_container>
<panel name="bottom_panel">
@@ -9,6 +9,6 @@
<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="Anziehen" name="wear_btn" tool_tip="Ausgewähltes Outfit tragen"/>
- <button label="M" name="look_edit_btn"/>
+ <button label="Outfit bearbeiten" name="edit_current_outfit_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 cc45f25c82..59cc3a8b70 100644
--- a/indra/newview/skins/default/xui/de/panel_people.xml
+++ b/indra/newview/skins/default/xui/de/panel_people.xml
@@ -1,14 +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_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="[secondlife:///app/search/groups Suche verwenden, um die Gruppe zu finden?]"/>
- <string name="no_groups_msg" value="[secondlife:///app/search/groups Suche verwenden, um Gruppen zu finden?]"/>
+ <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">
@@ -27,10 +36,6 @@
<button name="add_btn" tool_tip="Bieten Sie einem Einwohner die Freundschaft an"/>
<button name="del_btn" tool_tip="Ausgewählte Person von Ihrer Freundesliste entfernen"/>
</panel>
- <text name="no_friends_msg">
- Verwenden Sie [secondlife:///app/search/people die globale Suche], um Freunde hinzuzufügen. Oder klicken Sie mit rechts auf einen Einwohner und fügen Sie diesen als Freund hinzu.
-Wenn Sie nach Orten suchen, an denen sich Leute befinden, verwenden Sie [secondlife:///app/worldmap die Karte].
- </text>
</panel>
<panel label="MEINE GRUPPEN" name="groups_panel">
<panel label="bottom_panel" name="bottom_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 82e5febf8d..ed1421aa60 100644
--- a/indra/newview/skins/default/xui/de/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_place_profile.xml
@@ -83,7 +83,7 @@
<text name="scripts_value" value="Ein"/>
<text name="damage_label" value="Schaden:"/>
<text name="damage_value" value="Aus"/>
- <button label="Land-Info" name="about_land_btn"/>
+ <button label="Ãœber Land" name="about_land_btn"/>
</panel>
</accordion_tab>
<accordion_tab name="region_information_tab" title="Region">
@@ -100,12 +100,12 @@
<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">
+ <accordion_tab name="estate_information_tab" title="Grundbesitz">
<panel name="estate_information_panel">
- <text name="estate_name_label" value="Grundstück:"/>
+ <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:"/>
diff --git a/indra/newview/skins/default/xui/de/panel_places.xml b/indra/newview/skins/default/xui/de/panel_places.xml
index 2215ea3988..37ccdbeb7d 100644
--- a/indra/newview/skins/default/xui/de/panel_places.xml
+++ b/indra/newview/skins/default/xui/de/panel_places.xml
@@ -11,5 +11,6 @@
<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="Profil" name="profile_btn"/>
</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 78c495e377..f9d5c93dc0 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
@@ -3,6 +3,9 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
+ <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">
@@ -16,7 +19,10 @@
<check_box label="Avatarlippen beim Sprechen bewegen" name="enable_lip_sync"/>
<check_box label="Blasen-Chat" name="bubble_text_chat"/>
<slider label="Deckkraft" label_width="66" name="bubble_chat_opacity"/>
- <color_swatch name="background" tool_tip="Farbe für Blasen-Chat auswählen" left_pad="35"/>
+ <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="Chat in der Nähe" name="0"/>
@@ -26,4 +32,5 @@
<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" 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 0a0534c739..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,7 +3,7 @@
<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 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">
Immer anzeigen:
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 45b560c759..bf150daf87 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
@@ -46,7 +46,13 @@
<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="Kompakten 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).">
+ <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>
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 2516cd3a40..02c6fb0606 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
@@ -34,9 +34,12 @@
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]." value="0"/>
<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="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:
diff --git a/indra/newview/skins/default/xui/de/panel_profile.xml b/indra/newview/skins/default/xui/de/panel_profile.xml
index cb598f89f6..cda2788e40 100644
--- a/indra/newview/skins/default/xui/de/panel_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_profile.xml
@@ -41,10 +41,10 @@
</scroll_container>
</layout_panel>
<layout_panel name="profile_buttons_panel">
- <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="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="Anrufen" name="call" tool_tip="Diesen Einwohner anrufen"/>
- <button label="Karte" name="show_on_map_btn" tool_tip="Einwohner auf Karte anzeigen" width="36"/>
+ <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>
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 153082909a..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:
@@ -23,15 +23,15 @@
</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
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 920a513308..d1b8f0d78a 100644
--- a/indra/newview/skins/default/xui/de/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_debug.xml
@@ -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 92ad9741bc..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,16 +1,16 @@
<?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 wirken sich auf alle Regionen des Grundstücks 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)
@@ -18,7 +18,7 @@
<text name="Only Allow">
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" name="message_estate_btn"/>
- <button label="Einwohner hinauswerfen..." 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 2bf8721c86..be8507ebbd 100644
--- a/indra/newview/skins/default/xui/de/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_general.xml
@@ -33,7 +33,7 @@
<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="Allgemein" name="PG" value="13"/>
+ <icons_combo_box.item label="Generell" name="PG" value="13"/>
</icons_combo_box>
<button label="Ãœbernehmen" name="apply_btn"/>
<button label="Einen Einwohner nach Hause teleportieren..." name="kick_btn"/>
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_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml
index 0e182fa417..3dc6997320 100644
--- a/indra/newview/skins/default/xui/de/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml
@@ -22,7 +22,7 @@
[AMT] L$
</panel.string>
<button label="" label_selected="" name="buycurrency" tool_tip="Mein Kontostand"/>
- <button label="Kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>
+ <button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>
<text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">
24:00 H PST
</text>
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..26bde94ffd 100644
--- a/indra/newview/skins/default/xui/de/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/de/sidepanel_inventory.xml
@@ -3,6 +3,7 @@
<panel label="" name="sidepanel__inventory_panel">
<panel name="button_panel">
<button label="Profil" name="info_btn"/>
+ <button label="Teilen" name="share_btn"/>
<button label="Anziehen" name="wear_btn"/>
<button label="Wiedergeben" name="play_btn"/>
<button label="Teleportieren" name="teleport_btn"/>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index fc01b69461..03c858c880 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)
@@ -88,6 +103,9 @@
<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 +115,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 +187,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 +230,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>
@@ -230,6 +306,9 @@
<string name="GroupNameNone">
(keiner)
</string>
+ <string name="AvalineCaller">
+ Avaline-Anfrufer [ORDER]
+ </string>
<string name="AssetErrorNone">
Kein Fehler
</string>
@@ -335,6 +414,9 @@
<string name="symbolic link">
Link
</string>
+ <string name="symbolic folder link">
+ Link zu Ordner
+ </string>
<string name="AvatarEditingAppearance">
(Aussehen wird bearbeitet)
</string>
@@ -828,7 +910,7 @@
ESC drücken, um zur Normalansicht zurückzukehren
</string>
<string name="InventoryNoMatchingItems">
- Im Inventar wurden keine passenden Objekte gefunden. Versuchen Sie es mit [secondlife:///app/search/groups „Suche&quot;].
+ Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/all Suche].
</string>
<string name="FavoritesNoMatchingItems">
Landmarke hier hin ziehen, um diese hinzuzufügen.
@@ -849,6 +931,7 @@
Keine Inhalte
</string>
<string name="WornOnAttachmentPoint" value=" (getragen am [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (aktiviert)"/>
<string name="PermYes">
Ja
</string>
@@ -948,6 +1031,9 @@
<string name="InvFolder My Outfits">
Meine Outfits
</string>
+ <string name="InvFolder Accessories">
+ Zubehör
+ </string>
<string name="InvFolder Friends">
Freunde
</string>
@@ -1183,7 +1269,7 @@
Oben links
</string>
<string name="Center">
- Zentrieren
+ Mitte
</string>
<string name="Bottom Left">
Unten links
@@ -1289,13 +1375,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])
@@ -1471,8 +1557,11 @@
<string name="PanelContentsNewScript">
Neues Skript
</string>
+ <string name="PanelContentsTooltip">
+ Objektinhalt
+ </string>
<string name="BusyModeResponseDefault">
- Der Einwohner/Die Einwohnerin ist „beschäftigt&quot;, 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.
+ 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)
@@ -1487,14 +1576,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">
@@ -1588,7 +1675,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
@@ -3225,6 +3315,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>
@@ -3255,6 +3354,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>
@@ -3282,6 +3387,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="IM_moderator_label">
(Moderator)
</string>
+ <string name="answered_call">
+ Ihr Anruf wurde entgegengenommen
+ </string>
<string name="started_call">
haben/hat einen Anruf initiiert
</string>
@@ -3375,4 +3483,135 @@ 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="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="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>
</strings>
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 2764befeac..5f28fa6495 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -108,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"
@@ -275,7 +278,7 @@ Leyla Linden </text>
left_pad="4"
right="-10"
name="Set..."
- width="50"
+ width="90"
top_delta="-2"/>
<check_box
enabled="false"
@@ -407,7 +410,7 @@ Leyla Linden </text>
name="Cancel Land Sale"
left_pad="5"
top_pad="-25"
- width="155" />
+ width="180" />
<text
type="string"
length="1"
@@ -486,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"
@@ -499,7 +502,7 @@ Leyla Linden </text>
left="10"
name="Scripts..."
top_pad="1"
- width="100" />
+ width="150" />
<button
enabled="false"
follows="left|top"
@@ -516,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"
@@ -559,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
@@ -631,7 +639,6 @@ Leyla Linden </text>
length="1"
enabled="false"
follows="all"
- handle_edit_keys_directly="true"
height="200"
layout="topleft"
left="10"
@@ -748,6 +755,7 @@ Leyla Linden </text>
left_pad="10"
mouse_opaque="false"
name="resellable_clause"
+ word_wrap="true"
width="330">
Land in this region may not be resold.
</text>
@@ -1056,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
@@ -1068,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"
@@ -1234,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"
@@ -1260,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"
@@ -1287,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"
@@ -1341,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"
@@ -1402,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"
@@ -1619,7 +1628,7 @@ Only large parcels can be listed in search.
layout="topleft"
left_pad="5"
name="set_media_url"
- width="50"
+ width="70"
top_delta="0"/>
<check_box
follows="top|left"
@@ -1924,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..4643f66bd8
--- /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
+ legacy_header_height="18"
+ can_resize="false"
+ height="280"
+ layout="topleft"
+ min_height="280"
+ min_width="450"
+ name="floater_buy_currency_html"
+ help_topic="floater_buy_currency_html"
+ save_rect="true"
+ single_instance="true"
+ title="BUY CURRENCY"
+ width="452">
+ <floater.string
+ name="buy_currency_url" translate="false">
+ https://quick-buy-www.jeff.ooze.lindenlab.com/en/display
+ </floater.string>
+ <web_browser
+ bottom="278"
+ follows="left|right|top|bottom"
+ layout="topleft"
+ left="2"
+ name="browser"
+ top="18"
+ width="450" />
+</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 125b080519..df44b61632 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_land.xml
@@ -356,7 +356,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 b45e39a111..999cb9ed97 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -4,7 +4,6 @@
can_dock="true"
can_minimize="true"
can_close="false"
- center_horiz="true"
follows="bottom"
height="152"
layout="topleft"
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_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml
index 6f2b0fc3ea..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="90"
- 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="186"
+ 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"
+ 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="90"
- 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="186"
+ 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="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="90"
- 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="186"
+ 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="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="90"
- 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="186"
+ 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="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="186"
+ 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="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="90"
- 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="186"
+ 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="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="90"
- 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="90"
- 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="186"
+ 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="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="90"
- 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="186"
+ 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="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="90"
- 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="186"
+ 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="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="90"
- 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="186"
+ 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="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="90"
- 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="186"
+ 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="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="90"
- 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="186"
+ 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="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="90"
- 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="186"
+ 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="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="90"
- 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="186"
+ 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="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="90"
- 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="186"
+ 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="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_event.xml b/indra/newview/skins/default/xui/en/floater_event.xml
index 0255e202fb..d9c9d63c72 100644
--- a/indra/newview/skins/default/xui/en/floater_event.xml
+++ b/indra/newview/skins/default/xui/en/floater_event.xml
@@ -244,6 +244,7 @@
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>
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 36ef6beb59..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 Residents"
- label_selected="Kick all Residents"
- 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_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml
index 65a05f3ec5..ced8c29199 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"
@@ -27,7 +27,7 @@
halign="left"
use_ellipses="true"
top="0"
- width="390" />
+ width="394" />
<icon
color="DefaultShadowLight"
enabled="false"
@@ -38,5 +38,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 25016e0673..f537c81860 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -13,7 +13,7 @@
can_minimize="true"
can_close="true"
visible="false"
- width="360"
+ width="394"
can_resize="true"
min_width="250"
min_height="190">
@@ -22,7 +22,7 @@
default_tab_group="2"
follows="all"
height="320"
- width="360"
+ width="394"
layout="topleft"
orientation="horizontal"
name="im_panels"
@@ -43,7 +43,7 @@
tab_group="2"
top="0"
height="200"
- width="245"
+ width="254"
user_resize="true">
<button
height="20"
@@ -70,7 +70,7 @@
parse_highlights="true"
allow_html="true"
left="1"
- width="240">
+ width="249">
</chat_history>
<line_editor
bottom="0"
@@ -81,7 +81,7 @@
layout="bottomleft"
name="chat_editor"
tab_group="3"
- width="240">
+ 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_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml
index 0d381fe5cb..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">
- MY INVENTORY (Fetching [ITEM_COUNT] Items...) [FILTER]
- </floater.string>
- <floater.string
- name="TitleCompleted">
- MY 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_map.xml b/indra/newview/skins/default/xui/en/floater_map.xml
index 5d35275e17..249b091800 100644
--- a/indra/newview/skins/default/xui/en/floater_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_map.xml
@@ -1,6 +1,7 @@
<?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"
follows="top|right"
@@ -9,7 +10,7 @@
min_height="174"
min_width="174"
name="Map"
- title="Mini Map"
+ title=""
help_topic="map"
save_rect="true"
save_visibility="true"
@@ -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_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml
index 8e2c57764b..b690986e6b 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"
@@ -13,7 +12,7 @@
save_rect="true"
save_visibility="true"
save_dock_state="true"
- width="115">
+ width="113">
<string
name="walk_forward_tooltip">
Walk Forward (press Up Arrow or W)
@@ -23,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>
@@ -31,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>
@@ -39,6 +54,30 @@
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>
@@ -59,59 +98,91 @@
mouse_opaque="false"
name="panel_actions"
top="0"
- width="115">
+ width="113">
+ <!-- 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_Up_On"
+ image_pressed_selected="Movement_Up_On"
+ image_unselected="Movement_Up_Off"
+ layout="topleft"
+ left="23"
+ name="move up btn"
+ scale_image="false"
+ tool_tip="Fly up (press E)"
+ top="18"
+ width="24" />
+ <button
+ follows="left|bottom"
+ height="24"
image_selected="Movement_TurnLeft_On"
image_pressed_selected="Movement_TurnLeft_On"
image_unselected="Movement_TurnLeft_Off"
layout="topleft"
- left="17"
+ left="15"
name="turn left btn"
scale_image="false"
tool_tip="Turn left (press Left Arrow or A)"
- top="45"
- width="25" />
+ top_pad="-3"
+ width="24" />
+ <joystick_slide
+ follows="left|bottom"
+ height="24"
+ image_selected="Movement_Left_On"
+ image_pressed_selected="Movement_Left_On"
+ image_unselected="Movement_Left_Off"
+ layout="topleft"
+ left="18"
+ name="move left btn"
+ quadrant="left"
+ scale_image="false"
+ tool_tip="Walk left (press Shift + Left Arrow or A)"
+ top_pad="-3"
+ width="24" />
+ <!-- Right column -->
<button
follows="left|bottom"
- height="25"
+ height="24"
+ image_selected="Movement_Down_On"
+ image_pressed_selected="Movement_Down_On"
+ image_unselected="Movement_Down_Off"
+ layout="topleft"
+ right="-21"
+ name="move down btn"
+ scale_image="false"
+ tool_tip="Fly down (press C)"
+ top="18"
+ width="24" />
+ <button
+ follows="left|bottom"
+ height="24"
image_selected="Movement_TurnRight_On"
image_pressed_selected="Movement_TurnRight_On"
image_unselected="Movement_TurnRight_Off"
layout="topleft"
- left_pad="34"
+ right="-13"
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 E"
- top="14"
- width="25" />
- <button
+ top_pad="-3"
+ 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="24"
+ 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="-16"
scale_image="false"
- tool_tip="Fly down, press C"
- top_delta="0"
- width="20" />
+ tool_tip="Walk right (press Shift + Right Arrow or D)"
+ top_pad="-3"
+ width="24" />
+ <!-- Middle column -->
<joystick_turn
follows="left|bottom"
height="25"
@@ -124,7 +195,7 @@
quadrant="up"
scale_image="false"
tool_tip="Walk forward (press up arrow or W)"
- top_delta="10"
+ top="22"
width="21" />
<joystick_turn
follows="left|bottom"
@@ -138,7 +209,7 @@
quadrant="down"
scale_image="false"
tool_tip="Walk backward (press down arrow or S)"
- top_delta="30"
+ top_pad="7"
width="21" />
</panel>
<!-- Width and height of this panel should be synchronized with panel_stand_stop_flying.xml -->
@@ -149,7 +220,7 @@
left="0"
name="panel_modes"
top_pad="0"
- width="115">
+ width="113">
<button
follows="left|bottom"
height="23"
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 a2938e8574..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
@@ -45,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 2bafd1bdef..9db6568ee3 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -100,7 +100,7 @@ No Answer. Please try again later.
top="27"
width="315"
word_wrap="true">
- [VOICE_CHANNEL_NAME] has ended the call. [RECONNECT_NEARBY]
+ Your call has ended. [RECONNECT_NEARBY]
</text>
<text
font="SansSerifLarge"
@@ -119,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_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index d7a7daf30c..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,9 +46,9 @@
tab_group="1"
tab_position="left"
tab_width="115"
- tab_padding_right="5"
+ tab_padding_right="0"
top="21"
- width="620">
+ width="658">
<panel
class="panel_preference"
filename="panel_preferences_general.xml"
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..f766fe5a5d 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
@@ -298,7 +298,7 @@
layout="topleft"
left="3"
name="start"
- top="-11"
+ top="-51"
width="80" />
<radio_item
height="16"
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_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_debug_panel.xml b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
index bd9925be1d..e94af2c8d5 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,7 +15,7 @@
follows="left|top|right|bottom"
height="176"
layout="topleft"
- max_length="10000"
+ max_length="2147483647"
name="Chat History Editor"
parse_highlights="true"
width="420"
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 dda14f02ff..7dcf2aab99 100644
--- a/indra/newview/skins/default/xui/en/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml
@@ -1,395 +1,127 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- can_minimize="false"
- can_close="true"
+ can_minimize="true"
+ can_close="false"
follows="left|top"
- height="516"
+ height="340"
layout="topleft"
name="Snapshot"
help_topic="snapshot"
save_rect="true"
save_visibility="true"
- title="SNAPSHOT PREVIEW"
- width="215">
- <floater.string
- name="unknown">
- unknown
- </floater.string>
- <radio_group
- height="58"
- label="Snapshot type"
- layout="topleft"
- left="10"
- name="snapshot_type_radio"
- top="25"
- width="205">
- <radio_item
- bottom="19"
- height="16"
- label="Email"
- layout="topleft"
- name="postcard" />
- <radio_item
- bottom="38"
- height="16"
- label="My inventory (L$[AMOUNT])"
- layout="topleft"
- name="texture" />
- <radio_item
- bottom="57"
- height="16"
- label="Save to my computer"
- layout="topleft"
- name="local" />
- </radio_group>
- <ui_ctrl
- height="90"
- width="125"
+ can_dock="true"
+ title="Snapshot"
+ width="250">
+ <floater.string
+ name="unknown">
+ unknown
+ </floater.string>
+ <floater.string
+ name="share_to_web_url" translate="false">
+ http://pdp36.lindenlab.com:12777/
+ </floater.string>
+ <view
+ height="160"
+ width="230"
layout="topleft"
name="thumbnail_placeholder"
- top_pad="6"
+ top_pad="30"
follows="left|top"
left="10"
/>
- <text
- type="string"
- font="SansSerifSmall"
- length="1"
- follows="left|top"
- height="14"
- layout="topleft"
- right="-5"
- left_delta="0"
- halign="right"
- name="file_size_label"
- top_pad="10"
- width="195">
- [SIZE] KB
- </text>
- <button
- follows="left|top"
+ <button
+ follows="left|top"
+ height="22"
+ image_overlay="Refresh_Off"
+ layout="topleft"
+ left="20"
+ top_pad="-30"
+ name="new_snapshot_btn"
+ width="23" />
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="10"
+ max_length="500"
+ name="description"
+ top_pad="15"
+ width="230"
+ label="Description"/>
+ <button
+ label="Share Snapshot"
+ name="share"
+ top_pad="20"
+ left="10"
+ width="130"/>
+ <button
+ label="Share to Web"
+ name="share_to_web"
+ top_delta="0"
+ left="10"
+ width="130"/>
+ <button
+ label="Save to My Inventory"
+ name="save_to_inventory"
+ top_delta="0"
+ left="10"
+ width="130"/>
+ <button
+ label="Save Snapshot"
+ name="save"
+ top_pad="7"
+ left="10"
+ width="130"/>
+ <button
+ label="Email Snapshot"
+ name="share_to_email"
+ top_delta="0"
+ left="10"
+ width="130"/>
+ <button
+ label="Save to My Computer"
+ name="save_to_computer"
+ top_delta="0"
+ left="10"
+ width="130"/>
+ <button
+ label="Set As Profile Pic"
+ name="set_profile_pic"
+ top_pad="7"
+ left="10"
+ width="130"/>
+ <button
+ label="Back"
+ name="cancel"
+ top_delta="0"
+ left="10"
+ width="130"/>
+ <button
+ follows="left"
height="22"
- image_overlay="Refresh_Off"
- layout="topleft"
- left="10"
- name="new_snapshot_btn"
- width="23" />
- <button
- follows="left|top"
- height="23"
- label="Send"
- layout="topleft"
- left_pad="5"
- right="-5"
- name="send_btn"
- width="100" />
- <button
- follows="left|top"
- height="23"
- label="Save (L$[AMOUNT])"
- layout="topleft"
- right="-5"
- name="upload_btn"
- top_delta="0"
- width="100" />
- <flyout_button
- follows="left|top"
- height="23"
- label="Save"
- layout="topleft"
- right="-5"
- name="save_btn"
- tool_tip="Save image to a file"
- top_delta="0"
- 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
- follows="left|top"
- height="23"
- label="More"
- layout="topleft"
- left="10"
- name="more_btn"
- tool_tip="Advanced options"
- width="80" />
- <button
- follows="left|top"
- height="23"
- label="Less"
- layout="topleft"
- left_delta="0"
- name="less_btn"
- tool_tip="Advanced options"
- top_delta="0"
- width="80" />
- <button
- follows="left|top"
- height="23"
- label="Cancel"
- layout="topleft"
- right="-5"
- left_pad="5"
- name="discard_btn"
- width="100" />
- <text
- type="string"
- length="1"
- follows="top|left"
- height="12"
- layout="topleft"
- left="10"
- name="type_label2"
- top_pad="5"
- width="127">
- Size
- </text>
- <text
- type="string"
- length="1"
- follows="top|left"
- height="12"
- layout="topleft"
- left_pad="5"
- name="format_label"
- top_delta="0"
- width="70">
- Format
- </text>
- <combo_box
- height="23"
- label="Resolution"
- layout="topleft"
- left="10"
- name="postcard_size_combo"
- width="120">
- <combo_box.item
- label="Current Window"
- name="CurrentWindow"
- value="[i0,i0]" />
- <combo_box.item
- label="640x480"
- name="640x480"
- value="[i640,i480]" />
- <combo_box.item
- label="800x600"
- name="800x600"
- value="[i800,i600]" />
- <combo_box.item
- label="1024x768"
- name="1024x768"
- value="[i1024,i768]" />
- <combo_box.item
- label="Custom"
- name="Custom"
- value="[i-1,i-1]" />
- </combo_box>
- <combo_box
- height="23"
- label="Resolution"
layout="topleft"
- left_delta="0"
- name="texture_size_combo"
- top_delta="0"
- width="127">
- <combo_box.item
- label="Current Window"
- name="CurrentWindow"
- value="[i0,i0]" />
- <combo_box.item
- label="Small (128x128)"
- name="Small(128x128)"
- value="[i128,i128]" />
- <combo_box.item
- label="Medium (256x256)"
- name="Medium(256x256)"
- value="[i256,i256]" />
- <combo_box.item
- label="Large (512x512)"
- name="Large(512x512)"
- value="[i512,i512]" />
- <combo_box.item
- label="Custom"
- name="Custom"
- value="[i-1,i-1]" />
- </combo_box>
- <combo_box
- height="23"
- label="Resolution"
- layout="topleft"
- left_delta="0"
- name="local_size_combo"
- top_delta="0"
- width="127">
- <combo_box.item
- label="Current Window"
- name="CurrentWindow"
- value="[i0,i0]" />
- <combo_box.item
- label="320x240"
- name="320x240"
- value="[i320,i240]" />
- <combo_box.item
- label="640x480"
- name="640x480"
- value="[i640,i480]" />
- <combo_box.item
- label="800x600"
- name="800x600"
- value="[i800,i600]" />
- <combo_box.item
- label="1024x768"
- name="1024x768"
- value="[i1024,i768]" />
- <combo_box.item
- label="1280x1024"
- name="1280x1024"
- value="[i1280,i1024]" />
- <combo_box.item
- label="1600x1200"
- name="1600x1200"
- value="[i1600,i1200]" />
- <combo_box.item
- label="Custom"
- name="Custom"
- value="[i-1,i-1]" />
- </combo_box>
- <combo_box
- height="23"
- label="Format"
- layout="topleft"
- left_pad="5"
- name="local_format_combo"
- width="70">
- <combo_box.item
- label="PNG"
- name="PNG" />
- <combo_box.item
- label="JPEG"
- name="JPEG" />
- <combo_box.item
- label="BMP"
- name="BMP" />
- </combo_box>
- <spinner
- allow_text_entry="false"
- decimal_digits="0"
- follows="left|top"
- height="20"
- increment="32"
- label="Width"
- label_width="40"
- layout="topleft"
- left="10"
- max_val="6016"
- min_val="32"
- name="snapshot_width"
- top_pad="10"
- width="95" />
- <spinner
- allow_text_entry="false"
- decimal_digits="0"
- follows="left|top"
- height="20"
- increment="32"
- label="Height"
- label_width="40"
+ left="210"
+ name="show_advanced"
+ image_overlay="TabIcon_Close_Off"
+ top_delta="1"
+ width="30"/>
+ <button
+ follows="left"
+ height="22"
layout="topleft"
- left_pad="5"
- max_val="6016"
- min_val="32"
- name="snapshot_height"
+ left="210"
+ visible="false"
+ name="hide_advanced"
+ image_overlay="TabIcon_Open_Off"
top_delta="0"
- width="95" />
- <check_box
- bottom_delta="20"
- label="Constrain proportions"
- layout="topleft"
- left="10"
- name="keep_aspect_check" />
- <slider
- decimal_digits="0"
- follows="left|top"
- height="15"
- increment="1"
- initial_value="75"
- label="Image quality"
- label_width="100"
- layout="topleft"
- left_delta="0"
- max_val="100"
- name="image_quality_slider"
- top_pad="5"
- width="205" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="13"
- layout="topleft"
- left="10"
- name="layer_type_label"
- top_pad="5"
- width="50">
- Capture:
- </text>
- <combo_box
- height="23"
- label="Image Layers"
- layout="topleft"
- left="30"
- name="layer_types"
- width="145">
- <combo_box.item
- label="Colors"
- name="Colors"
- value="colors" />
- <combo_box.item
- label="Depth"
- name="Depth"
- value="depth" />
- </combo_box>
- <check_box
- label="Interface"
- layout="topleft"
- left="30"
- top_pad="10"
- width="180"
- name="ui_check" />
- <check_box
- label="HUDs"
- layout="topleft"
- left="30"
- top_pad="10"
- width="180"
- name="hud_check" />
- <check_box
- label="Keep open after saving"
- layout="topleft"
- left="10"
- top_pad="8"
- width="180"
- name="keep_open_check" />
- <check_box
- label="Freeze frame (fullscreen)"
- layout="topleft"
- left="10"
- top_pad="8"
- width="180"
- name="freeze_frame_check" />
- <check_box
- label="Auto-refresh"
- layout="topleft"
- left="10"
- top_pad="8"
- width="180"
- name="auto_snapshot_check" />
+ width="30"/>
+ <panel
+ visible="false"
+ left="250"
+ top="17"
+ name="snapshot_advanced"
+ filename="panel_snapshot_advanced.xml"/>
</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 b730f0e511..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>
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 80cb2723a0..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
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 12d169b70a..efc1a66d95 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -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
@@ -152,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
@@ -219,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">
@@ -249,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>
@@ -265,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]
@@ -273,20 +275,31 @@
<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"
@@ -294,7 +307,7 @@
initial_value="true"
label="Snap to grid"
layout="topleft"
- top_pad="7"
+ top_pad="0"
name="checkbox snap to grid"
width="134" />
<combo_box
@@ -303,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"
@@ -330,7 +344,7 @@
top_delta="0"
right="-10"
width="18"
- height="19" >
+ height="23" >
<button.commit_callback
function="BuildTool.gridOptions"/>
</button>
@@ -342,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"
@@ -355,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"
@@ -368,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"
@@ -381,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"
@@ -394,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"
@@ -407,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"
@@ -420,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"
@@ -433,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"
@@ -446,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"
@@ -459,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"
@@ -472,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"
@@ -485,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"
@@ -498,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"
@@ -511,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"
@@ -525,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"
@@ -580,7 +594,7 @@
layout="topleft"
left="0"
name="radio select land"
- top="-1"
+ top="-106"
width="134" />
<radio_item
height="19"
@@ -639,7 +653,7 @@
follows="left|top"
height="12"
layout="topleft"
- left="150"
+ left="135"
name="Bulldozer:"
top="57"
width="100">
@@ -697,7 +711,7 @@
</slider_bar>
<button
follows="left|top"
- height="19"
+ height="23"
label="Apply"
label_selected="Apply"
top_pad="5"
@@ -705,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>
@@ -713,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>
@@ -741,12 +755,12 @@
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"
@@ -756,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>
@@ -922,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
@@ -949,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"
@@ -985,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="7"
- width="93" />
+ width="100" />
<!-- NEW SALE TYPE COMBO BOX -->
<combo_box
- left_pad="3"
+ 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"
@@ -1026,12 +1039,12 @@ 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" />
@@ -1055,7 +1068,7 @@ even though the user gets a free copy.
left="0"
top="241"
height="130"
- width="278">
+ width="290">
<text
type="string"
length="1"
@@ -1082,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"
@@ -1104,9 +1117,9 @@ even though the user gets a free copy.
follows="left|top|right"
label="Modify"
layout="topleft"
- left="5"
+ left="10"
name="checkbox next owner can modify"
- width="80" />
+ width="85" />
<check_box
follows="left|top|right"
height="19"
@@ -1212,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"
@@ -1553,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>
@@ -1601,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"
@@ -1882,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>
@@ -1999,7 +2012,6 @@ even though the user gets a free copy.
value="Cylinder" />
</combo_box>
</panel>
-
<panel
border="false"
follows="all"
@@ -2011,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"
@@ -2249,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
@@ -2313,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>
@@ -2331,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" />
@@ -2344,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
@@ -2353,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"
@@ -2372,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
@@ -2381,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"
@@ -2408,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
@@ -2417,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"
@@ -2533,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>
@@ -2542,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" />
@@ -2562,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"
@@ -2586,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
@@ -2625,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>
@@ -2634,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"
@@ -2662,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"
@@ -2719,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"
@@ -2744,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
@@ -2766,36 +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
border="true"
border_visible="true"
bevel_style="in"
- follows="left|top"
+ follows="left|top|right"
height="325"
layout="topleft"
left="10"
name="contents_inventory"
top="50"
- width="260" />
+ width="275" />
</panel>
</tab_container>
<panel
@@ -2805,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"
@@ -2845,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"
@@ -2873,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"
@@ -2906,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 3a981adfdf..3b10a57c50 100644
--- a/indra/newview/skins/default/xui/en/floater_ui_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_ui_preview.xml
@@ -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 114b9a84e3..5b77f11d71 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
@@ -10,7 +10,9 @@
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
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 d09a41978d..85a5be369c 100644
--- a/indra/newview/skins/default/xui/en/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/en/floater_windlight_options.xml
@@ -1132,7 +1132,7 @@
layout="topleft"
left_delta="0"
name="BHText8"
- top_pad="5"
+ top_pad="8"
width="10">
X
</text>
@@ -1145,7 +1145,7 @@
initial_value="0.5"
layout="topleft"
left_pad="3"
- top_pad="6"
+ top_pad="8"
name="WLCloudDetailX"
width="200" />
<text
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 291f8f6f51..ad40cafe61 100644
--- a/indra/newview/skins/default/xui/en/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_world_map.xml
@@ -2,8 +2,7 @@
<floater
legacy_header_height="18"
can_resize="true"
- center_horiz="true"
- center_vert="true"
+ open_centered="true"
height="600"
layout="topleft"
min_height="520"
@@ -496,7 +495,7 @@
top_delta="-1"
name="DoSearch"
tool_tip="Search for region"
- width="58">
+ width="62">
<button.commit_callback
function="WMap.Location" />
</button>
@@ -538,6 +537,7 @@
<button
follows="right|bottom"
height="23"
+ image_unselected="PushButton_On"
label="Teleport"
layout="topleft"
left="25"
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..f629eef475 100644
--- a/indra/newview/skins/default/xui/en/inspect_object.xml
+++ b/indra/newview/skins/default/xui/en/inspect_object.xml
@@ -18,71 +18,63 @@
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"
+ value="Test Object Name That Is actually two lines and Really Long"
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?
+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>
<!-- Overlapping buttons for all default actions. Show "Buy" if
for sale, "Sit" if can sit, etc. -->
@@ -90,10 +82,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
index 39fb54d513..a7ecc39ed8 100644
--- a/indra/newview/skins/default/xui/en/inspector_info_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/inspector_info_ctrl.xml
@@ -1,8 +1,8 @@
<button
chrome="true"
- image_selected="Info_Small"
- image_unselected="Info_Small"
- image_pressed="Info_Small"
+ image_selected="Info_Over"
+ image_unselected="Info_Over"
+ image_pressed="Info_Over"
height="12"
name="inspector_info_ctrl"
width="12" />
diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index 85853f39bb..b2e4a7ad95 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -143,12 +143,19 @@
<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"/>
+ <view mouse_opaque="false"
+ follows="all"
+ name="menu_bar_holder"
+ left="0"
+ top="0"
+ width="1024"
+ height="768"/>
<notify_box_view top="0"
follows="all"
height="768"
@@ -157,6 +164,33 @@
tab_group="-2"
width="1024"/>
<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"
@@ -169,16 +203,6 @@
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..dc51ae8b92 100644
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -68,8 +68,8 @@
function="Self.EnableStandUp" />
</menu_item_call>
<menu_item_call
- label="My Appearance"
- name="Appearance...">
+ label="Change Outfit"
+ name="Change Outfit">
<menu_item_call.on_click
function="CustomizeAvatar" />
<menu_item_call.on_enable
@@ -99,5 +99,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_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..ccd5388621 100644
--- a/indra/newview/skins/default/xui/en/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/menu_bottomtray.xml
@@ -52,6 +52,61 @@
function="CheckControl"
parameter="ShowSnapshotButton" />
</menu_item_check>
+ <menu_item_check
+ label="Sidebar button"
+ layout="topleft"
+ name="ShowSidebarButton">
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="ShowSidebarButton" />
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="ShowSidebarButton" />
+ </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..b422d87938
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_cof_attachment.xml
@@ -0,0 +1,21 @@
+<?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
+ label="Attach to"
+ layout="topleft"
+ name="attach_to" />
+ <context_menu
+ label="Attach to HUD"
+ layout="topleft"
+ name="attach_to_hud" />
+</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..01008ef203
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_cof_body_part.xml
@@ -0,0 +1,22 @@
+<?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>
+</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..f9cb29f0d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_cof_clothing.xml
@@ -0,0 +1,42 @@
+<?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" />
+ </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>
+</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..982d4f2015
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_cof_gear.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu
+ layout="topleft"
+ name="Gear COF">
+ <menu_item_call
+ label="Add To Outfit"
+ layout="topleft"
+ name="add">
+ <on_click
+ function="Gear.OnClick"
+ parameter="add"/>
+ <on_enable
+ function="Gear.OnEnable"
+ parameter="add" />
+ </menu_item_call>
+</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_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
index 1b002b1c32..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"/>
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..11459ad0e6 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">
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 2c97112e38..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"
@@ -138,26 +138,13 @@
</context_menu>
<menu_item_separator layout="topleft" />
<menu_item_call
- label="Buy"
- layout="topleft"
- name="Pie Object Bye">
- <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"
layout="topleft"
name="Pie Object Take">
<menu_item_call.on_click
- function="Tools.BuyOrTake"/>
- <menu_item_call.on_visible
- function="Tools.VisibleTakeObject"/>
+ function="Object.Take"/>
<menu_item_call.on_enable
- function="Tools.EnableBuyOrTake"/>
+ function="Object.VisibleTake"/>
</menu_item_call>
<menu_item_call
enabled="false"
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..dfc72b557c
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
@@ -0,0 +1,50 @@
+<?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.OnClick"
+ parameter="wear"/>
+ <on_enable
+ function="Gear.OnEnable"
+ parameter="wear" />
+ </menu_item_call>
+ <menu_item_call
+ label="Take Off - Remove Current Outfit"
+ layout="topleft"
+ name="take_off">
+ <on_click
+ function="Gear.OnClick"
+ parameter="take_off"/>
+ <on_enable
+ function="Gear.OnEnable"
+ parameter="take_off" />
+ </menu_item_call>
+ <menu_item_separator />
+ <menu_item_call
+ label="Rename"
+ layout="topleft"
+ name="rename">
+ <on_click
+ function="Gear.OnClick"
+ parameter="rename"/>
+ <on_enable
+ function="Gear.OnEnable"
+ parameter="rename" />
+ </menu_item_call>
+ <menu_item_call
+ label="Delete Outfit"
+ layout="topleft"
+ name="delete_outfit">
+ <on_click
+ function="Gear.OnClick"
+ parameter="delete_outfit"/>
+ <on_enable
+ function="Gear.OnEnable"
+ parameter="delete_outfit" />
+ </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..8f3e62157a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_outfit_tab.xml
@@ -0,0 +1,41 @@
+<?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" />
+ </menu_item_call>
+ <menu_item_call
+ label="Wear - Add to Current Outfit"
+ layout="topleft"
+ name="wear_add">
+ <on_click
+ function="Outfit.WearAdd" />
+ </menu_item_call>
+ <menu_item_call
+ label="Take Off - Remove Current Outfit"
+ layout="topleft"
+ name="take_off">
+ <on_click
+ function="Outfit.TakeOff" />
+ </menu_item_call>
+ <menu_item_separator />
+ <menu_item_call
+ label="Rename"
+ layout="topleft"
+ name="rename">
+ <on_click
+ function="Outfit.Rename" />
+ </menu_item_call>
+ <menu_item_call
+ label="Delete Outfit"
+ layout="topleft"
+ name="delete">
+ <on_click
+ function="Outfit.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 014a52bb4f..d2e35e4cc0 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
@@ -88,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_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_profile_overflow.xml b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml
index 5162a4902f..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">
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..a8778df7f6
--- /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 New">
+ <menu_item_call.on_click
+ function="Outfit.SaveAsNew.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_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 158e764eae..aff8f7ddf4 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
@@ -56,7 +48,6 @@
<menu_item_check
label="My Inventory"
name="Inventory"
- layout="topleft"
shortcut="control|shift|I"
visible="false">
<menu_item_check.on_check
@@ -69,7 +60,6 @@
<menu_item_check
label="My Inventory"
name="ShowSidetrayInventory"
- layout="topleft"
shortcut="control|I"
visible="true">
<menu_item_check.on_check
@@ -81,7 +71,6 @@
</menu_item_check>
<menu_item_check
label="My Gestures"
- layout="topleft"
name="Gestures"
shortcut="control|G">
<menu_item_check.on_check
@@ -93,21 +82,16 @@
</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"/>
@@ -115,7 +99,6 @@
</menu>
<menu_item_call
label="Request Admin Status"
- layout="topleft"
name="Request Admin Options"
shortcut="control|alt|G"
visible="false">
@@ -124,18 +107,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
@@ -144,12 +124,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
@@ -158,26 +136,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" />
@@ -187,7 +163,6 @@
</menu_item_check>
<menu_item_call
label="Nearby People"
- layout="topleft"
name="Active Speakers"
shortcut="control|shift|A">
<menu_item_call.on_click
@@ -197,12 +172,10 @@
</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
@@ -214,7 +187,6 @@
</menu_item_check>
<menu_item_check
label="World Map"
- layout="topleft"
name="World Map"
shortcut="control|M"
use_mac_ctrl="true">
@@ -227,7 +199,6 @@
</menu_item_check>
<menu_item_call
label="Snapshot"
- layout="topleft"
name="Take Snapshot"
shortcut="control|shift|S">
<menu_item_call.on_click
@@ -236,7 +207,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" />
@@ -246,12 +216,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"
@@ -259,18 +234,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" />
@@ -279,7 +251,6 @@
</menu_item_call>
<menu_item_call
label="My Land"
- layout="topleft"
name="My Land">
<menu_item_call.on_click
function="Floater.Show"
@@ -288,12 +259,10 @@
<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"
@@ -303,7 +272,6 @@
</menu_item_check>
<menu_item_check
label="View Controls"
- layout="topleft"
name="Camera Controls">
<menu_item_check.on_check
function="Floater.Visible"
@@ -313,7 +281,6 @@
</menu_item_check>
<menu_item_check
label="Ban Lines"
- layout="topleft"
name="Ban Lines">
<menu_item_check.on_check
control="ShowBanLines" />
@@ -323,7 +290,6 @@
</menu_item_check>
<menu_item_check
label="Beacons"
- layout="topleft"
name="beacons"
shortcut="control|alt|shift|N">
<menu_item_check.on_check
@@ -335,7 +301,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
@@ -346,7 +311,6 @@
</menu_item_check>
<menu_item_check
label="Land Owners"
- layout="topleft"
name="Land Owners">
<menu_item_check.on_check
control="ShowParcelOwners" />
@@ -373,11 +337,9 @@
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
@@ -387,7 +349,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" />
@@ -396,7 +357,6 @@
</menu_item_call>
<!-- <menu_item_check
label="Show Navigation Bar"
- layout="topleft"
name="ShowNavbarNavigationPanel">
<menu_item_check.on_click
function="ToggleControl"
@@ -407,7 +367,6 @@
</menu_item_check>
<menu_item_check
label="Show Favorites Bar"
- layout="topleft"
name="ShowNavbarFavoritesPanel">
<menu_item_check.on_click
function="ToggleControl"
@@ -416,19 +375,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"
@@ -436,7 +391,6 @@
</menu_item_call>
<menu_item_call
label="Midday"
- layout="topleft"
name="Noon"
shortcut="control|shift|Y">
<menu_item_call.on_click
@@ -445,7 +399,6 @@
</menu_item_call>
<menu_item_call
label="Sunset"
- layout="topleft"
name="Sunset"
shortcut="control|shift|N">
<menu_item_call.on_click
@@ -454,7 +407,6 @@
</menu_item_call>
<menu_item_call
label="Midnight"
- layout="topleft"
name="Midnight">
<menu_item_call.on_click
function="World.EnvSettings"
@@ -462,17 +414,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"
@@ -483,13 +432,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
@@ -502,12 +449,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
@@ -516,7 +461,6 @@
</menu_item_call>
<menu_item_call
label="Move Tool"
- layout="topleft"
name="Move"
shortcut="control|2">
<menu_item_call.on_click
@@ -525,7 +469,6 @@
</menu_item_call>
<menu_item_call
label="Edit Tool"
- layout="topleft"
name="Edit"
shortcut="control|3">
<menu_item_call.on_click
@@ -534,7 +477,6 @@
</menu_item_call>
<menu_item_call
label="Create Tool"
- layout="topleft"
name="Create"
shortcut="control|4">
<menu_item_call.on_click
@@ -543,7 +485,6 @@
</menu_item_call>
<menu_item_call
label="Land Tool"
- layout="topleft"
name="Land"
shortcut="control|5">
<menu_item_call.on_click
@@ -551,112 +492,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
@@ -666,7 +503,6 @@
</menu_item_call>
<menu_item_call
label="Unlink"
- layout="topleft"
name="Unlink"
shortcut="control|shift|L">
<menu_item_call.on_click
@@ -676,7 +512,6 @@
</menu_item_call>
<menu_item_check
label="Edit Linked Parts"
- layout="topleft"
name="Edit Linked Parts">
<menu_item_check.on_check
control="EditLinkedParts" />
@@ -686,11 +521,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
@@ -701,7 +580,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
@@ -710,17 +588,14 @@
<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 Buy">
<menu_item_call.on_click
function="Tools.BuyOrTake"/>
@@ -731,7 +606,6 @@
</menu_item_call>
<menu_item_call
label="Take"
- layout="topleft"
name="Menu Object Take">
<menu_item_call.on_click
function="Tools.BuyOrTake"/>
@@ -742,7 +616,6 @@
</menu_item_call>
<menu_item_call
label="Take Copy"
- layout="topleft"
name="Take Copy">
<menu_item_call.on_click
function="Tools.TakeCopy" />
@@ -751,7 +624,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" />
@@ -760,7 +632,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" />
@@ -771,12 +642,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"
@@ -786,7 +655,6 @@
</menu_item_call>
<menu_item_call
label="Recompile Scripts (LSL)"
- layout="topleft"
name="LSL">
<menu_item_call.on_click
function="Tools.SelectedScriptAction"
@@ -796,7 +664,6 @@
</menu_item_call>
<menu_item_call
label="Reset Scripts"
- layout="topleft"
name="Reset Scripts">
<menu_item_call.on_click
function="Tools.SelectedScriptAction"
@@ -806,7 +673,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"
@@ -816,7 +682,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"
@@ -825,17 +690,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"
@@ -843,7 +705,6 @@
</menu_item_call>
<menu_item_check
label="Show Advanced Permissions"
- layout="topleft"
name="DebugPermissions">
<menu_item_check.on_check
function="CheckControl"
@@ -852,11 +713,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" />
@@ -866,7 +725,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" />
@@ -876,18 +734,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" />
@@ -896,7 +751,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" />
@@ -905,7 +759,6 @@
</menu_item_check>
<menu_item_check
label="Show Selection Beam"
- layout="topleft"
name="Show Selection Beam">
<menu_item_check.on_check
control="ShowSelectionBeam" />
@@ -913,11 +766,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
@@ -930,7 +781,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
@@ -940,7 +790,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
@@ -950,7 +799,6 @@
</menu_item_call>
<menu_item_call
label="Grid Options"
- layout="topleft"
name="Grid Options"
shortcut="control|shift|B">
<menu_item_call.on_click
@@ -962,100 +810,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"
@@ -1064,20 +910,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|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
@@ -1085,7 +939,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" />
@@ -1100,7 +953,6 @@
<menu_item_separator/>
<menu_item_check
label="Limit Select Distance"
- layout="topleft"
name="Limit Select Distance">
<menu_item_check.on_check
function="CheckControl"
@@ -1111,7 +963,6 @@
</menu_item_check>
<menu_item_check
label="Disable Camera Constraints"
- layout="topleft"
name="Disable Camera Distance">
<menu_item_check.on_check
function="CheckControl"
@@ -1120,11 +971,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"
@@ -1135,7 +984,6 @@
</menu_item_check>
<menu_item_check
label="Quiet Snapshots to Disk"
- layout="topleft"
name="QuietSnapshotsToDisk">
<menu_item_check.on_check
function="CheckControl"
@@ -1146,7 +994,6 @@
</menu_item_check>
<menu_item_check
label="Compress Snapshots to Disk"
- layout="topleft"
name="CompressSnapshotsToDisk">
<menu_item_check.on_check
function="CheckControl"
@@ -1155,17 +1002,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"
@@ -1173,7 +1017,6 @@
</menu_item_call>
<menu_item_check
label="Statistics Bar"
- layout="topleft"
name="Statistics Bar"
shortcut="control|shift|1">
<menu_item_check.on_check
@@ -1185,7 +1028,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"
@@ -1198,12 +1040,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"
@@ -1214,7 +1054,6 @@
</menu_item_check>
<menu_item_check
label="Hide Particles"
- layout="topleft"
name="Hide Particles"
shortcut="control|alt|shift|=">
<menu_item_check.on_check
@@ -1226,7 +1065,6 @@
</menu_item_check>
<menu_item_check
label="Hide Selected"
- layout="topleft"
name="Hide Selected">
<menu_item_check.on_check
function="CheckControl"
@@ -1237,7 +1075,6 @@
</menu_item_check>
<menu_item_check
label="Highlight Transparent"
- layout="topleft"
name="Highlight Transparent"
shortcut="control|alt|T">
<menu_item_check.on_check
@@ -1247,7 +1084,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
@@ -1257,7 +1093,6 @@
</menu_item_check>
<menu_item_check
label="Show Mouselook Crosshairs"
- layout="topleft"
name="ShowCrosshairs">
<menu_item_check.on_check
function="CheckControl"
@@ -1269,12 +1104,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
@@ -1282,11 +1115,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" />
@@ -1296,9 +1127,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" />
@@ -1315,12 +1145,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
@@ -1332,7 +1160,6 @@
</menu_item_check>
<menu_item_check
label="Alpha"
- layout="topleft"
name="Alpha"
shortcut="control|alt|shift|2">
<menu_item_check.on_check
@@ -1344,7 +1171,6 @@
</menu_item_check>
<menu_item_check
label="Tree"
- layout="topleft"
name="Tree"
shortcut="control|alt|shift|3">
<menu_item_check.on_check
@@ -1356,7 +1182,6 @@
</menu_item_check>
<menu_item_check
label="Avatars"
- layout="topleft"
name="Character"
shortcut="control|alt|shift|4">
<menu_item_check.on_check
@@ -1368,7 +1193,6 @@
</menu_item_check>
<menu_item_check
label="SurfacePath"
- layout="topleft"
name="SurfacePath"
shortcut="control|alt|shift|5">
<menu_item_check.on_check
@@ -1380,7 +1204,6 @@
</menu_item_check>
<menu_item_check
label="Sky"
- layout="topleft"
name="Sky"
shortcut="control|alt|shift|6">
<menu_item_check.on_check
@@ -1392,7 +1215,6 @@
</menu_item_check>
<menu_item_check
label="Water"
- layout="topleft"
name="Water"
shortcut="control|alt|shift|7">
<menu_item_check.on_check
@@ -1404,7 +1226,6 @@
</menu_item_check>
<menu_item_check
label="Ground"
- layout="topleft"
name="Ground"
shortcut="control|alt|shift|8">
<menu_item_check.on_check
@@ -1416,7 +1237,6 @@
</menu_item_check>
<menu_item_check
label="Volume"
- layout="topleft"
name="Volume"
shortcut="control|alt|shift|9">
<menu_item_check.on_check
@@ -1428,7 +1248,6 @@
</menu_item_check>
<menu_item_check
label="Grass"
- layout="topleft"
name="Grass"
shortcut="control|alt|shift|0">
<menu_item_check.on_check
@@ -1440,7 +1259,6 @@
</menu_item_check>
<menu_item_check
label="Clouds"
- layout="topleft"
name="Clouds"
shortcut="control|alt|shift|-">
<menu_item_check.on_check
@@ -1452,7 +1270,6 @@
</menu_item_check>
<menu_item_check
label="Particles"
- layout="topleft"
name="Particles"
shortcut="control|alt|shift|=">
<menu_item_check.on_check
@@ -1464,7 +1281,6 @@
</menu_item_check>
<menu_item_check
label="Bump"
- layout="topleft"
name="Bump"
shortcut="control|alt|shift|\">
<menu_item_check.on_check
@@ -1478,12 +1294,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
@@ -1495,7 +1309,6 @@
</menu_item_check>
<menu_item_check
label="Selected"
- layout="topleft"
name="Selected"
shortcut="control|alt|F2">
<menu_item_check.on_check
@@ -1507,7 +1320,6 @@
</menu_item_check>
<menu_item_check
label="Highlighted"
- layout="topleft"
name="Highlighted"
shortcut="control|alt|F3">
<menu_item_check.on_check
@@ -1519,7 +1331,6 @@
</menu_item_check>
<menu_item_check
label="Dynamic Textures"
- layout="topleft"
name="Dynamic Textures"
shortcut="control|alt|F4">
<menu_item_check.on_check
@@ -1531,7 +1342,6 @@
</menu_item_check>
<menu_item_check
label="Foot Shadows"
- layout="topleft"
name="Foot Shadows"
shortcut="control|alt|F5">
<menu_item_check.on_check
@@ -1543,7 +1353,6 @@
</menu_item_check>
<menu_item_check
label="Fog"
- layout="topleft"
name="Fog"
shortcut="control|alt|F6">
<menu_item_check.on_check
@@ -1555,7 +1364,6 @@
</menu_item_check>
<menu_item_check
label="Test FRInfo"
- layout="topleft"
name="Test FRInfo"
shortcut="control|alt|F8">
<menu_item_check.on_check
@@ -1567,7 +1375,6 @@
</menu_item_check>
<menu_item_check
label="Flexible Objects"
- layout="topleft"
name="Flexible Objects"
shortcut="control|alt|F9">
<menu_item_check.on_check
@@ -1580,7 +1387,6 @@
</menu>
<menu_item_check
label="Run Multiple Threads"
- layout="topleft"
name="Run Multiple Threads">
<menu_item_check.on_check
function="CheckControl"
@@ -1589,9 +1395,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"
@@ -1599,7 +1414,6 @@
</menu_item_call>
<menu_item_check
label="Mouse Smoothing"
- layout="topleft"
name="Mouse Smoothing">
<menu_item_check.on_check
function="CheckControl"
@@ -1608,17 +1422,14 @@
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])..."
- layout="topleft"
name="Upload Image"
shortcut="control|U">
<menu_item_call.on_click
@@ -1629,7 +1440,6 @@
</menu_item_call>
<menu_item_check
label="Search"
- layout="topleft"
name="Search"
shortcut="control|F">
<menu_item_check.on_check
@@ -1642,7 +1452,6 @@
<menu_item_call
enabled="false"
label="Release Keys"
- layout="topleft"
name="Release Keys">
<menu_item_call.on_click
function="Tools.ReleaseKeys"
@@ -1653,16 +1462,13 @@
</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" />
+ <menu_item_separator/>
<menu_item_check
label="Always Run"
- layout="topleft"
name="Always Run"
shortcut="control|R">
<menu_item_check.on_check
@@ -1672,7 +1478,6 @@
</menu_item_check>
<menu_item_check
label="Fly"
- layout="topleft"
name="Fly"
shortcut="Home">
<menu_item_check.on_check
@@ -1682,11 +1487,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
@@ -1696,7 +1499,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
@@ -1704,22 +1506,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
@@ -1729,7 +1527,6 @@
</menu_item_call>
<menu_item_check
label="Joystick Flycam"
- layout="topleft"
name="Joystick Flycam"
shortcut="alt|shift|F">
<menu_item_check.on_check
@@ -1741,7 +1538,6 @@
</menu_item_check>
<menu_item_call
label="Reset View"
- layout="topleft"
name="Reset View"
shortcut="Esc">
<menu_item_call.on_click
@@ -1749,7 +1545,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
@@ -1757,17 +1552,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
@@ -1776,7 +1568,6 @@
</menu_item_call>
<menu_item_call
label="Move Tool"
- layout="topleft"
name="Move"
shortcut="control|2">
<menu_item_call.on_click
@@ -1785,7 +1576,6 @@
</menu_item_call>
<menu_item_call
label="Edit Tool"
- layout="topleft"
name="Edit"
shortcut="control|3">
<menu_item_call.on_click
@@ -1794,7 +1584,6 @@
</menu_item_call>
<menu_item_call
label="Create Tool"
- layout="topleft"
name="Create"
shortcut="control|4">
<menu_item_call.on_click
@@ -1803,7 +1592,6 @@
</menu_item_call>
<menu_item_call
label="Land Tool"
- layout="topleft"
name="Land"
shortcut="control|5">
<menu_item_call.on_click
@@ -1811,11 +1599,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
@@ -1823,7 +1609,6 @@
</menu_item_call>
<menu_item_call
label="Zoom Default"
- layout="topleft"
name="Zoom Default"
shortcut="control|9">
<menu_item_call.on_click
@@ -1831,29 +1616,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"
@@ -1861,7 +1632,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
@@ -1871,23 +1641,21 @@
function="ToggleControl"
parameter="QAMode" />
</menu_item_check>
+
</menu>
<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">
@@ -1900,7 +1668,6 @@
</menu_item_check>
<menu_item_check
label="Debug Console"
- layout="topleft"
name="Debug Console"
shortcut="control|shift|4"
use_mac_ctrl="true">
@@ -1913,7 +1680,6 @@
</menu_item_check>
<menu_item_call
label="Notifications Console"
- layout="topleft"
name="Notifications"
shortcut="control|shift|5">
<menu_item_call.on_click
@@ -1922,7 +1688,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
@@ -1934,7 +1699,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
@@ -1946,7 +1710,6 @@
</menu_item_check>
<menu_item_check
label="Fast Timers"
- layout="topleft"
name="Fast Timers"
shortcut="control|shift|9"
use_mac_ctrl="true">
@@ -1959,7 +1722,6 @@
</menu_item_check>
<menu_item_check
label="Memory"
- layout="topleft"
name="Memory"
shortcut="control|shift|0"
use_mac_ctrl="true">
@@ -1970,11 +1732,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"
@@ -1982,7 +1742,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"
@@ -1990,17 +1749,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"
@@ -2011,7 +1767,6 @@
</menu_item_check>
<menu_item_check
label="Wind"
- layout="topleft"
name="Wind">
<menu_item_check.on_check
function="Advanced.CheckHUDInfo"
@@ -2022,7 +1777,6 @@
</menu_item_check>
<menu_item_check
label="FOV"
- layout="topleft"
name="FOV">
<menu_item_check.on_check
function="Advanced.CheckHUDInfo"
@@ -2033,7 +1787,6 @@
</menu_item_check>
<menu_item_check
label="Badge"
- layout="topleft"
name="Badge"
shortcut="alt|control|shift|h">
<menu_item_check.on_check
@@ -2047,12 +1800,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"
@@ -2063,7 +1814,6 @@
</menu_item_check>
<menu_item_check
label="Show Render Info"
- layout="topleft"
name="Show Render Info">
<menu_item_check.on_check
function="CheckControl"
@@ -2074,7 +1824,6 @@
</menu_item_check>
<menu_item_check
label="Show Matrices"
- layout="topleft"
name="Show Matrices">
<menu_item_check.on_check
function="CheckControl"
@@ -2085,7 +1834,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"
@@ -2094,11 +1842,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
@@ -2108,17 +1854,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
@@ -2126,49 +1869,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"
@@ -2178,12 +1914,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"
@@ -2194,7 +1928,6 @@
</menu_item_check>
<menu_item_check
label="Randomize Framerate"
- layout="topleft"
name="Randomize Framerate">
<menu_item_check.on_check
function="Advanced.CheckRandomizeFramerate"
@@ -2204,7 +1937,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"
@@ -2215,7 +1947,6 @@
</menu_item_check>
<menu_item_check
label="Frame Test"
- layout="topleft"
name="Frame Test">
<menu_item_check.on_check
function="Advanced.CheckFrameTest"
@@ -2227,12 +1958,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"
@@ -2243,7 +1972,6 @@
</menu_item_check>
<menu_item_check
label="Octree"
- layout="topleft"
name="Octree">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2254,7 +1982,6 @@
</menu_item_check>
<menu_item_check
label="Shadow Frusta"
- layout="topleft"
name="Shadow Frusta">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2265,7 +1992,6 @@
</menu_item_check>
<menu_item_check
label="Occlusion"
- layout="topleft"
name="Occlusion">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2276,7 +2002,6 @@
</menu_item_check>
<menu_item_check
label="Render Batches"
- layout="topleft"
name="Render Batches">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2287,7 +2012,6 @@
</menu_item_check>
<menu_item_check
label="Texture Anim"
- layout="topleft"
name="Texture Anim">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2298,7 +2022,6 @@
</menu_item_check>
<menu_item_check
label="Texture Priority"
- layout="topleft"
name="Texture Priority">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2309,7 +2032,6 @@
</menu_item_check>
<menu_item_check
label="Texture Area"
- layout="topleft"
name="Texture Area">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2320,7 +2042,6 @@
</menu_item_check>
<menu_item_check
label="Face Area"
- layout="topleft"
name="Face Area">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2331,7 +2052,6 @@
</menu_item_check>
<menu_item_check
label="Lights"
- layout="topleft"
name="Lights">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2342,7 +2062,6 @@
</menu_item_check>
<menu_item_check
label="Collision Skeleton"
- layout="topleft"
name="Collision Skeleton">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2353,7 +2072,6 @@
</menu_item_check>
<menu_item_check
label="Raycast"
- layout="topleft"
name="Raycast">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2366,7 +2084,6 @@
<menu
create_jump_keys="true"
label="Rendering"
- layout="topleft"
name="Rendering"
tear_off="true">
<menu_item_check
@@ -2508,7 +2225,6 @@
</menu_item_check>
<menu_item_check
label="Full Res Textures"
- layout="topleft"
name="Rull Res Textures">
<menu_item_check.on_check
function="CheckControl"
@@ -2519,7 +2235,6 @@
</menu_item_check>
<menu_item_check
label="Audit Textures"
- layout="topleft"
name="Audit Textures">
<menu_item_check.on_check
function="CheckControl"
@@ -2573,12 +2288,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"
@@ -2587,27 +2300,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"
@@ -2618,7 +2326,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"
@@ -2627,11 +2334,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
@@ -2640,14 +2345,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"
@@ -2657,12 +2360,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"
@@ -2670,7 +2371,6 @@
</menu_item_call>
<menu_item_call
label="Stop Playback"
- layout="topleft"
name="Stop Playback">
<menu_item_call.on_click
function="Advanced.AgentPilot"
@@ -2678,7 +2378,6 @@
</menu_item_call>
<menu_item_check
label="Loop Playback"
- layout="topleft"
name="Loop Playback">
<menu_item_check.on_check
function="Advanced.CheckAgentPilotLoop"
@@ -2688,7 +2387,6 @@
</menu_item_check>
<menu_item_call
label="Start Record"
- layout="topleft"
name="Start Record">
<menu_item_call.on_click
function="Advanced.AgentPilot"
@@ -2696,7 +2394,6 @@
</menu_item_call>
<menu_item_call
label="Stop Record"
- layout="topleft"
name="Stop Record">
<menu_item_call.on_click
function="Advanced.AgentPilot"
@@ -2707,12 +2404,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"
@@ -2723,7 +2418,6 @@
</menu_item_check>
<menu_item_check
label="Cheesy Beacon"
- layout="topleft"
name="Cheesy Beacon">
<menu_item_check.on_check
function="CheckControl"
@@ -2734,7 +2428,6 @@
</menu_item_check>
<menu_item_check
label="Fixed Weather"
- layout="topleft"
name="Fixed Weather">
<menu_item_check.on_check
function="CheckControl"
@@ -2745,7 +2438,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" />
@@ -2754,12 +2446,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"
@@ -2770,7 +2460,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"
@@ -2778,14 +2467,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" />
@@ -2798,14 +2485,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
@@ -2813,7 +2498,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
@@ -2821,7 +2505,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
@@ -2829,7 +2512,6 @@
</menu_item_call>
<menu_item_check
label="Double-ClickAuto-Pilot"
- layout="topleft"
name="Double-ClickAuto-Pilot">
<menu_item_check.on_check
function="CheckControl"
@@ -2842,7 +2524,6 @@
<menu_item_separator />
<menu_item_check
label="Debug SelectMgr"
- layout="topleft"
name="Debug SelectMgr">
<menu_item_check.on_check
function="CheckControl"
@@ -2853,7 +2534,6 @@
</menu_item_check>
<menu_item_check
label="Debug Clicks"
- layout="topleft"
name="Debug Clicks">
<menu_item_check.on_check
function="Advanced.CheckDebugClicks"
@@ -2864,7 +2544,6 @@
</menu_item_check>
<menu_item_check
label="Debug Views"
- layout="topleft"
name="Debug Views">
<menu_item_check.on_check
function="Advanced.CheckDebugViews" />
@@ -2873,7 +2552,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"
@@ -2883,7 +2561,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"
@@ -2893,7 +2570,6 @@
</menu_item_check>
<menu_item_check
label="Debug Keys"
- layout="topleft"
name="Debug Keys">
<menu_item_check.on_check
function="Advanced.CheckDebugKeys"
@@ -2903,7 +2579,6 @@
</menu_item_check>
<menu_item_check
label="Debug WindowProc"
- layout="topleft"
name="Debug WindowProc">
<menu_item_check.on_check
function="Advanced.CheckDebugWindowProc"
@@ -2920,14 +2595,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"
@@ -2935,21 +2608,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"
@@ -2959,7 +2629,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" />
@@ -2968,18 +2637,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"
@@ -2990,7 +2656,6 @@
</menu_item_call>
<menu_item_call
label="Head"
- layout="topleft"
name="Head">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
@@ -3001,7 +2666,6 @@
</menu_item_call>
<menu_item_call
label="Upper Body"
- layout="topleft"
name="Upper Body">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
@@ -3012,7 +2676,6 @@
</menu_item_call>
<menu_item_call
label="Lower Body"
- layout="topleft"
name="Lower Body">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
@@ -3023,7 +2686,6 @@
</menu_item_call>
<menu_item_call
label="Skirt"
- layout="topleft"
name="Skirt">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
@@ -3036,19 +2698,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" />
@@ -3057,28 +2716,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"
@@ -3090,14 +2745,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"
@@ -3108,7 +2761,6 @@
</menu_item_check>
<menu_item_check
label="Slow Motion Animations"
- layout="topleft"
name="Slow Motion Animations">
<menu_item_check.on_check
function="CheckControl"
@@ -3119,7 +2771,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"
@@ -3129,7 +2780,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"
@@ -3139,7 +2789,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"
@@ -3149,7 +2798,6 @@
</menu_item_check>
<menu_item_check
label="Disable LOD"
- layout="topleft"
name="Disable LOD">
<menu_item_check.on_check
function="Advanced.CheckDisableLOD"
@@ -3159,7 +2807,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"
@@ -3169,7 +2816,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"
@@ -3180,7 +2826,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"
@@ -3192,7 +2837,6 @@
<!-- Appears not to exist anymore
<menu_item_check
label="Debug Rotation"
- layout="topleft"
name="Debug Rotation">
<menu_item_check.on_check
function="CheckControl"
@@ -3204,14 +2848,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
@@ -3219,18 +2861,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"
@@ -3241,14 +2880,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"
@@ -3259,7 +2896,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"
@@ -3268,11 +2904,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"
@@ -3282,7 +2916,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
@@ -3290,7 +2923,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
@@ -3300,18 +2932,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
@@ -3321,7 +2950,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" />
@@ -3330,7 +2958,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" />
@@ -3339,7 +2966,6 @@
</menu_item_call>
<menu_item_call
label="Delete"
- layout="topleft"
name="Delete"
shortcut="control|alt|shift|Del">
<menu_item_call.on_click
@@ -3349,7 +2975,6 @@
</menu_item_call>
<menu_item_call
label="Lock"
- layout="topleft"
name="Lock"
shortcut="control|alt|shift|L">
<menu_item_call.on_click
@@ -3359,7 +2984,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
@@ -3371,12 +2995,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" />
@@ -3385,7 +3007,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
@@ -3395,7 +3016,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" />
@@ -3406,12 +3026,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" />
@@ -3420,7 +3038,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" />
@@ -3430,7 +3047,6 @@
</menu>
<menu_item_call
label="God Tools"
- layout="topleft"
name="God Tools">
<menu_item_call.on_click
function="Floater.Show"
@@ -3442,34 +3058,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"
@@ -3480,7 +3091,6 @@
</menu_item_call>
<menu_item_call
label="Pants"
- layout="topleft"
name="Pants">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3491,7 +3101,6 @@
</menu_item_call>
<menu_item_call
label="Shoes"
- layout="topleft"
name="Shoes">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3502,7 +3111,6 @@
</menu_item_call>
<menu_item_call
label="Socks"
- layout="topleft"
name="Socks">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3513,7 +3121,6 @@
</menu_item_call>
<menu_item_call
label="Jacket"
- layout="topleft"
name="Jacket">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3524,7 +3131,6 @@
</menu_item_call>
<menu_item_call
label="Gloves"
- layout="topleft"
name="Gloves">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3535,7 +3141,6 @@
</menu_item_call>
<menu_item_call
label="Undershirt"
- layout="topleft"
name="Menu Undershirt">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3546,7 +3151,6 @@
</menu_item_call>
<menu_item_call
label="Underpants"
- layout="topleft"
name="Menu Underpants">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3557,7 +3161,6 @@
</menu_item_call>
<menu_item_call
label="Skirt"
- layout="topleft"
name="Skirt">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3568,7 +3171,6 @@
</menu_item_call>
<menu_item_call
label="Alpha"
- layout="topleft"
name="Alpha">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3579,7 +3181,6 @@
</menu_item_call>
<menu_item_call
label="Tattoo"
- layout="topleft"
name="Tattoo">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3590,7 +3191,6 @@
</menu_item_call>
<menu_item_call
label="All Clothes"
- layout="topleft"
name="All Clothes">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3600,12 +3200,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"
@@ -3614,7 +3212,6 @@
</menu_item_call>
<menu_item_call
label="Scripting Portal"
- layout="topleft"
name="Scripting Portal">
<menu_item_call.on_click
function="PromptShowURL"
@@ -3624,12 +3221,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"
@@ -3638,18 +3233,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"
@@ -3658,7 +3250,6 @@
</menu_item_call>
<menu_item_call
label="Security Issues"
- layout="topleft"
name="Security Issues">
<menu_item_call.on_click
function="PromptShowURL"
@@ -3667,7 +3258,6 @@
</menu_item_call>
<menu_item_call
label="QA Wiki"
- layout="topleft"
name="QA Wiki">
<menu_item_call.on_click
function="PromptShowURL"
@@ -3677,4 +3267,4 @@
</menu>
</menu>
</menu>
-</menu_bar>
+</menu_bar> \ No newline at end of file
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..7ea7eaade5
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ name="Outfit Wearable Context Menu">
+ <menu_item_call
+ label="Wear"
+ layout="topleft"
+ name="wear">
+ <on_click
+ function="Wearable.Wear" />
+ </menu_item_call>
+ <menu_item_call
+ label="Detach"
+ layout="topleft"
+ name="detach">
+ <on_click
+ function="Attachment.Detach" />
+ </menu_item_call>
+<!-- *TODO: implement the submenus
+ <menu
+ label="Attach to"
+ layout="topleft"
+ name="attach_to" />
+ <menu
+ label="Attach to HUD"
+ layout="topleft"
+ name="attach_to_hud" />
+-->
+ <menu_item_call
+ label="Object Profile"
+ layout="topleft"
+ name="object_profile">
+ <on_click
+ function="Attachment.Profile" />
+ </menu_item_call>
+ <menu_item_call
+ label="Take Off"
+ layout="topleft"
+ name="take_off">
+ <on_click
+ function="Clothing.TakeOff"
+ parameter="take_off"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Edit"
+ layout="topleft"
+ name="edit">
+ <on_click
+ function="Wearable.Edit"
+ parameter="edit"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Show Original"
+ layout="topleft"
+ name="show_original">
+ <on_click
+ function="Wearable.ShowOriginal" />
+ </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 a2540237c8..0bf71844bf 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -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"
@@ -1199,6 +1207,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>
@@ -1384,6 +1393,18 @@ Unable to encode file: [FILE]
<notification
icon="alertmodal.tga"
+ name="CorruptedProtectedDataStore"
+ type="alertmodal">
+ We are unable to read your protected data so it is being reset.
+ 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]
@@ -2024,6 +2045,28 @@ 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>
+ </notification>
+
+ <notification
icon="alertmodal.tga"
name="RemoveFromFriends"
type="alertmodal">
@@ -2102,6 +2145,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.
@@ -2395,6 +2451,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"
@@ -2406,6 +2513,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>
@@ -2413,6 +2521,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>
@@ -3111,6 +3220,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"
@@ -3330,7 +3451,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"
@@ -3346,6 +3467,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">
@@ -4269,6 +4397,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"
@@ -4301,6 +4436,7 @@ Replaced missing clothing/body part with default.
<notification
icon="groupnotify"
name="GroupNotice"
+ persist="true"
type="groupnotify">
Topic: [SUBJECT], Message: [MESSAGE]
</notification>
@@ -4335,8 +4471,21 @@ Uploading in-world and web site snapshots...
</notification>
<notification
+ icon="alertmodal.tga"
+ name="UploadConfirmation"
+ type="alertmodal">
+Uploading costs L$[AMOUNT].
+Do you wish to proceed?
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="Upload"/>
+ </notification>
+
+ <notification
icon="notify.tga"
name="UploadPayment"
+ persist="true"
type="notify">
You paid L$[AMOUNT] to upload.
</notification>
@@ -4624,6 +4773,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>
@@ -4631,10 +4781,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"
@@ -4662,6 +4815,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.
@@ -4677,6 +4831,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]
@@ -4685,6 +4840,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.
@@ -4692,6 +4848,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>
@@ -4711,6 +4868,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>
@@ -4718,6 +4876,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>
@@ -4725,6 +4884,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>
@@ -4732,6 +4892,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.
@@ -4741,6 +4902,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>
@@ -4748,6 +4910,7 @@ 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]:
&lt;nolink&gt;[MSG]&lt;/nolink&gt;
@@ -4756,6 +4919,7 @@ Message from [NAME]:
<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.
@@ -4765,6 +4929,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.
@@ -4774,6 +4939,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/>
@@ -4782,6 +4948,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/>
@@ -4790,6 +4957,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/>
@@ -4798,6 +4966,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>
@@ -4805,6 +4974,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>
@@ -4812,6 +4982,7 @@ This region is not running any scripts.
<notification
icon="notify.tga"
name="NoOutsideScripts"
+ persist="true"
type="notify">
This land has outside scripts disabled.
@@ -4821,6 +4992,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>
@@ -4828,6 +5000,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.
@@ -4837,6 +5010,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>
@@ -4844,6 +5018,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>
@@ -4851,6 +5026,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>
@@ -4858,6 +5034,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>
@@ -4865,6 +5042,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>
@@ -4872,6 +5050,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>
@@ -4879,6 +5058,7 @@ No destination region found.
<notification
icon="notify.tga"
name="NotAllowedInDest"
+ persist="true"
type="notify">
You are not allowed into the destination.
</notification>
@@ -4886,6 +5066,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>
@@ -4893,6 +5074,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>
@@ -4900,6 +5082,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>
@@ -4907,6 +5090,7 @@ Could not teleport closer to destination.
<notification
icon="notify.tga"
name="TPCancelled"
+ persist="true"
type="notify">
Teleport cancelled.
</notification>
@@ -4914,6 +5098,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.
@@ -4922,6 +5107,7 @@ Please try again in a few moments.
<notification
icon="notify.tga"
name="GeneralFailure"
+ persist="true"
type="notify">
General failure.
</notification>
@@ -4929,6 +5115,7 @@ General failure.
<notification
icon="notify.tga"
name="RoutedWrongRegion"
+ persist="true"
type="notify">
Routed to wrong region. Please try again.
</notification>
@@ -4936,6 +5123,7 @@ Routed to wrong region. Please try again.
<notification
icon="notify.tga"
name="NoValidAgentID"
+ persist="true"
type="notify">
No valid agent id.
</notification>
@@ -4943,6 +5131,7 @@ No valid agent id.
<notification
icon="notify.tga"
name="NoValidSession"
+ persist="true"
type="notify">
No valid session id.
</notification>
@@ -4950,6 +5139,7 @@ No valid session id.
<notification
icon="notify.tga"
name="NoValidCircuit"
+ persist="true"
type="notify">
No valid circuit code.
</notification>
@@ -4957,6 +5147,7 @@ No valid circuit code.
<notification
icon="notify.tga"
name="NoValidTimestamp"
+ persist="true"
type="notify">
No valid timestamp.
</notification>
@@ -4964,6 +5155,7 @@ No valid timestamp.
<notification
icon="notify.tga"
name="NoPendingConnection"
+ persist="true"
type="notify">
Unable to create pending connection.
</notification>
@@ -4971,6 +5163,7 @@ Unable to create pending connection.
<notification
icon="notify.tga"
name="InternalUsherError"
+ persist="true"
type="notify">
Internal error attempting to connect agent usher.
</notification>
@@ -4978,6 +5171,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>
@@ -4985,6 +5179,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>
@@ -4992,6 +5187,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>
@@ -4999,6 +5195,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>
@@ -5027,28 +5224,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]:
@@ -5072,6 +5247,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]
@@ -5081,6 +5257,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">
@@ -5103,9 +5280,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"
@@ -5129,6 +5306,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]
@@ -5148,7 +5326,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]
@@ -5175,6 +5353,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.
@@ -5201,6 +5380,7 @@ 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>
@@ -5222,6 +5402,7 @@ Friendship offer declined.
<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.
@@ -5242,6 +5423,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.
@@ -5252,6 +5434,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.
@@ -5260,6 +5443,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]?
@@ -5281,6 +5465,7 @@ From object: [OBJECTNAME], owner: [NAME]?
<notification
icon="notify.tga"
name="FailedToFindWearableUnnamed"
+ persist="true"
type="notify">
Failed to find [TYPE] in database.
</notification>
@@ -5288,13 +5473,23 @@ 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>
<notification
icon="notify.tga"
+ name="ShareToWebFailed"
+ persist="true"
+ type="notify">
+ Failed to upload image to web.
+ </notification>
+
+ <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>
@@ -5302,6 +5497,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:
@@ -5327,6 +5523,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:
@@ -5354,6 +5551,7 @@ Grant this request?
<notification
icon="notify.tga"
name="ScriptDialog"
+ persist="true"
type="notify">
[FIRST] [LAST]&apos;s &apos;[TITLE]&apos;
[MESSAGE]
@@ -5368,6 +5566,7 @@ Grant this request?
<notification
icon="notify.tga"
name="ScriptDialogGroup"
+ persist="true"
type="notify">
[GROUPNAME]&apos;s &apos;[TITLE]&apos;
[MESSAGE]
@@ -5379,31 +5578,11 @@ Grant this request?
</form>
</notification>
- <notification
- icon="notify.tga"
- name="ScriptToast"
- type="notify">
- [FIRST] [LAST]&apos;s &apos;[TITLE]&apos; is requesting Resident 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.
@@ -5412,6 +5591,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.
@@ -5421,6 +5601,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!
@@ -5433,6 +5614,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.
@@ -5442,6 +5624,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.
@@ -5451,6 +5634,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>
@@ -5460,6 +5644,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.
@@ -5469,6 +5654,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>
@@ -5478,6 +5664,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.
@@ -5489,6 +5676,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.
@@ -5498,6 +5686,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.
@@ -5510,6 +5699,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.
@@ -5520,6 +5710,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>
@@ -5527,6 +5718,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.
@@ -5539,6 +5731,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>
@@ -5548,6 +5741,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>
@@ -5588,6 +5782,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>
@@ -5595,6 +5790,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>
@@ -5602,6 +5798,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>
@@ -5915,6 +6112,113 @@ 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">
+Drag items from inventory onto a person in the resident picker
+ </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 in [TIME] seconds.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="AvatarRezSelfNotification"
+ type="notifytip">
+( [EXISTENCE] seconds alive )
+You finished baking your outfit in [TIME] seconds.
+ </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="notifytip.tga"
+ name="AvatarRezLeftNotification"
+ type="notifytip">
+( [EXISTENCE] seconds alive )
+Avatar '[NAME]' left as fully loaded.
+ </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"
+ notext="Ok"
+ yestext="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..066992b25d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml
@@ -0,0 +1,22 @@
+<?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"
+ 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"
+ />
+</accordion_tab>
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 1e2e74f882..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,7 +69,7 @@
name="last_interaction"
text_color="LtGray_50"
value="0s"
- width="24" />
+ width="35" />
<button
follows="right"
height="16"
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..d3f6695375 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
@@ -39,7 +39,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..e3f6045e27
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="top|right|left"
+ height="22"
+ layout="topleft"
+ left="0"
+ name="wearable_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="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="4"
+ value="..."
+ width="359" />
+ <icon
+ name="btn_lock"
+ layout="topleft"
+ follows="top|right"
+ image_name="Locked_Icon"
+ top="2"
+ left="0"
+ height="13"
+ width="9"
+ tab_stop="false" />
+ <button
+ name="btn_edit"
+ layout="topleft"
+ follows="top|right"
+ image_overlay="Edit_Wrench"
+ top="0"
+ left_pad="3"
+ height="20"
+ width="20"
+ tab_stop="false" />
+ <panel
+ background_visible="true"
+ bg_alpha_color="0.4 0.4 0.4 1.0"
+ bottom="0"
+ follows="left|right|top"
+ height="1"
+ layout="bottomleft"
+ left="0"
+ name="wearable_type_separator_panel"
+ 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..9d19b89a61
--- /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_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ label="Shop >"
+ layout="topleft"
+ right="-5"
+ name="bodyparts_shop_btn"
+ top="5"
+ width="61" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 015a2e91ff..ac61c7da5d 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -1,315 +1,433 @@
<?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"
- min_height="23"
- width="310"
- top="4"
max_width="320"
- min_width="216"
+ min_height="23"
+ 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="100"
+ 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">
- <speak_button
- name="speak_btn"
- label="Speak"
- label_selected="Speak"
- />
- <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="22"
+ 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="62"
+ 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
+ <layout_panel
auto_resize="false"
- color="0 0 0 0"
follows="left|right"
- height="10"
- image_name="spacer24.tga"
+ height="28"
layout="topleft"
- left="0"
- min_width="3"
- name="after_cam_panel"
- top="0"
- width="3"/>
- <layout_panel
+ min_width="40"
mouse_opaque="false"
+ name="snapshot_panel"
+ user_resize="false"
+ width="39">
+ <button
+ 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_width="40"
- name="snapshot_panel"
- width="40">
+ min_height="28"
+ min_width="52"
+ mouse_opaque="false"
+ name="sidebar_btn_panel"
+ user_resize="false"
+ width="83">
+<!--*TODO: Implement toggle of sidebar with buttons
+Disabled for now.
+-->
<button
- follows="left|right"
+ control_name="SidebarWithButtonsVisibility"
+ follows="left|right"
height="23"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
image_selected="PushButton_Selected_Press"
+ is_toggle="true"
+ label="Sidebar"
+ layout="topleft"
+ left="0"
+ name="sidebar_btn"
+ tool_tip="Shows/hides Sidebar"
+ top="5"
+ use_ellipses="true"
+ width="80">
+ </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="30"
layout="topleft"
- top="0"
+ min_width="95"
+ mouse_opaque="false"
name="chiclet_list_panel"
- width="189"
- min_width="60"
+ 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="24"
layout="topleft"
left="1"
- min_width="60"
+ min_width="95"
+ mouse_opaque="false"
name="chiclet_list"
top="7"
- chiclet_padding="4"
- scrolling_offset="40"
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>
@@ -325,25 +443,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">
@@ -369,8 +486,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>
@@ -382,25 +499,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"
@@ -409,38 +513,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 250dadd390..9124ad528d 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -21,6 +21,7 @@
top="3"
width="18" />
<text
+ allow_html="false"
allow_scroll="false"
v_pad = "7"
read_only = "true"
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 996e28c575..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
@@ -65,6 +65,7 @@
left="103"
name="description"
textbox.max_length="1024"
+ textbox.label="More"
textbox.show_context_menu="false"
top_pad="0"
width="178"
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..2359719c2a
--- /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_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ label="Shop >"
+ layout="topleft"
+ right="-5"
+ name="clothing_shop_btn"
+ top="5"
+ width="61" />
+</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..b1782f405e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml
@@ -0,0 +1,112 @@
+<?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="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" />
+ <button
+ name="btn_delete"
+ layout="topleft"
+ follows="top|left"
+ image_unselected="Toast_CloseBtn"
+ image_selected="Toast_CloseBtn"
+ top="0"
+ left="0"
+ height="20"
+ width="20"
+ tab_stop="false" />
+ <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="4"
+ value="..."
+ width="359" />
+ <button
+ name="btn_move_up"
+ layout="topleft"
+ follows="top|right"
+ image_overlay="UpArrow_Off"
+ top="0"
+ left="0"
+ height="20"
+ width="20"
+ tab_stop="false" />
+ <button
+ name="btn_move_down"
+ layout="topleft"
+ follows="top|right"
+ image_overlay="DownArrow_Off"
+ top="0"
+ left_pad="3"
+ height="20"
+ width="20"
+ tab_stop="false" />
+ <icon
+ name="btn_lock"
+ layout="topleft"
+ follows="top|right"
+ image_name="Locked_Icon"
+ top="2"
+ left_pad="1"
+ height="13"
+ width="9" />
+ <button
+ name="btn_edit"
+ layout="topleft"
+ follows="top|right"
+ image_overlay="Edit_Wrench"
+ top="0"
+ left_pad="3"
+ height="20"
+ width="20"
+ tab_stop="false" />
+ <panel
+ background_visible="true"
+ bg_alpha_color="0.4 0.4 0.4 1.0"
+ bottom="0"
+ follows="left|right|top"
+ height="1"
+ layout="bottomleft"
+ left="0"
+ name="wearable_type_separator_panel"
+ 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..cf84c31078
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
@@ -0,0 +1,110 @@
+<?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
+ follows="all"
+ height="200"
+ 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"
+ 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">
+
+ <!-- *NOTE there should be no any gaps between the button bar and the list -
+ accordiong-list adaptor won't employ them while calculating new height when the size of the list changes -->
+ <panel
+ background_visible="false"
+ class="accordion_list_adaptor"
+ follows="all"
+ height="45"
+ layout="topleft"
+ left="0"
+ name="button_bar_adaptor"
+ top="0"
+ width="311">
+ <panel
+ bevel="none"
+ filename="panel_clothing_list_button_bar.xml"
+ height="35"
+ name="button_bar"
+ top="0"
+ width="311" />
+ <flat_list_view
+ allow_select="true"
+ follows="all"
+ height="10"
+ layout="topleft"
+ left="0"
+ multi_select="true"
+ name="list_clothing"
+ top_pad="0"
+ width="311" />
+ </panel>
+ </accordion_tab>
+ <accordion_tab
+ layout="topleft"
+ name="tab_body_parts"
+ title="Body Parts">
+
+ <!-- *NOTE there should be no any gaps between the button bar and the list -
+ accordiong-list adaptor won't employ them while calculating new height when the size of the list changes -->
+ <panel
+ background_visible="false"
+ class="accordion_list_adaptor"
+ follows="all"
+ height="45"
+ layout="topleft"
+ left="0"
+ name="button_bar_adaptor"
+ top="0"
+ width="311">
+ <panel
+ bevel="none"
+ filename="panel_bodyparts_list_button_bar.xml"
+ height="35"
+ name="button_bar"
+ top="0"
+ width="311"/>
+ <flat_list_view
+ allow_select="true"
+ follows="all"
+ height="10"
+ layout="topleft"
+ left="0"
+ multi_select="true"
+ name="list_body_parts"
+ top_pad="0"
+ width="311" />
+ </panel>
+ </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..2f37b9d3c9
--- /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="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" />
+ <button
+ name="btn_delete"
+ layout="topleft"
+ follows="top|left"
+ image_unselected="Toast_CloseBtn"
+ image_selected="Toast_CloseBtn"
+ top="0"
+ left="0"
+ height="20"
+ width="20"
+ tab_stop="false" />
+ <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="4"
+ value="..."
+ width="359" />
+ <panel
+ background_visible="true"
+ bg_alpha_color="0.4 0.4 0.4 1.0"
+ bottom="0"
+ follows="left|right|top"
+ height="1"
+ layout="bottomleft"
+ left="0"
+ name="wearable_type_separator_panel"
+ 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..c5fbd1cae6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="top|right|left"
+ height="22"
+ layout="topleft"
+ left="0"
+ name="dummy_clothing_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"
+ 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" />
+ <button
+ name="btn_add"
+ layout="topleft"
+ follows="top|right"
+ image_overlay="AddItem_Off"
+ top="0"
+ left="0"
+ height="20"
+ width="20"
+ tab_stop="false" />
+ <panel
+ background_visible="true"
+ bg_alpha_color="0.4 0.4 0.4 1.0"
+ bottom="0"
+ follows="left|right|top"
+ height="1"
+ layout="bottomleft"
+ left="0"
+ name="wearable_type_separator_panel"
+ 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..cfcdc25f81 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_alpha.xml
@@ -1,33 +1,41 @@
<?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" >
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="100"
label="Lower Alpha"
layout="topleft"
- left="10"
+ left="30"
name="Lower Alpha"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="94" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<check_box
control_name="LowerAlphaTextureInvisible"
follows="left"
@@ -41,14 +49,17 @@
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="100"
label="Upper Alpha"
layout="topleft"
- left_pad="10"
+ left_pad="20"
name="Upper Alpha"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="94">
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<check_box
control_name="UpperAlphaTextureInvisible"
follows="left"
@@ -62,14 +73,17 @@
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="100"
label="Head Alpha"
layout="topleft"
- left_pad="10"
+ left="30"
name="Head Alpha"
tool_tip="Click to choose a picture"
- top="10"
- width="64" />
+ top="120"
+ width="94" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<check_box
control_name="HeadAlphaTextureInvisible"
follows="left"
@@ -83,14 +97,17 @@
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="100"
label="Eye Alpha"
layout="topleft"
- left="10"
+ left_pad="20"
name="Eye Alpha"
tool_tip="Click to choose a picture"
- top="100"
- width="64" />
+ top="120"
+ width="94" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<check_box
control_name="Eye AlphaTextureInvisible"
follows="left"
@@ -104,14 +121,17 @@
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="100"
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" />
+ top="230"
+ width="94" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<check_box
control_name="HairAlphaTextureInvisible"
follows="left"
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..4149a0b06f 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,52 @@
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
+ 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..94fd2f9080 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,62 @@
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
+ 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..9b60e83387 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,46 @@
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">
+ 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 +75,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 +89,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 +103,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..248ae9fe04 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,66 @@
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
+ 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..3ed1df2399 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,62 @@
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
+ 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 7445bb339d..08ee0306dd 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
@@ -12,6 +12,10 @@
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"
@@ -179,7 +183,7 @@
<button
follows="bottom|left"
height="23"
- label="Save [WHAT]"
+ label="Save Pick"
layout="topleft"
name="save_changes_btn"
left="0"
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 26be8440e7..dff2b9a214 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
@@ -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">
@@ -200,7 +200,7 @@
height="102"
layout="topleft"
left="123"
- max_length="512"
+ max_length="254"
top="157"
name="fl_description_edit"
width="157"
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..cf15fb0455 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,61 @@
<?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"
- left="10"
+ width="333" >
+ <text
+ follows="top|left|right"
+ font="SansSerifSmallBold"
+ halign="right"
+ height="12"
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>
+ left="0"
+ name="avatar_height"
+ text_color="EmphasisColor"
+ top="0"
+ width="310">
+ [HEIGHT] Meters tall
+ </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"
+ 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 +63,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 +77,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 +91,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 +106,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 +120,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 +134,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 +148,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 +162,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 +173,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..e088aa05ac 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,62 @@
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"
+ 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..e079047a86 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,62 @@
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
+ 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..9158685c40 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,46 @@
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"
+ 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 +108,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 +122,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 +136,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..87f3270b31 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,62 @@
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
+ 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..5bd99969a2 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,62 @@
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
+ 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..6d02dd41de 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,76 @@
<?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="100"
label="Head Tattoo"
layout="topleft"
- left="10"
+ left="30"
name="Head Tattoo"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="94" />
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="100"
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="94" />
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="100"
label="Lower Tattoo"
layout="topleft"
- left_pad="10"
+ left="30"
name="Lower Tattoo"
tool_tip="Click to choose a picture"
+ top_pad="10"
+ width="94" />
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="80"
+ label="Color/Tint"
+ layout="topleft"
+ 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>
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..bbe5230341 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,62 @@
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
+ 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..a79c1b9eaa 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,62 @@
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
+ 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..0455086ef3 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
@@ -107,7 +107,7 @@ left="0"
Jacket:
</string>
<string
- name="skirt_skirt_desc_text">
+ name="skirt_desc_text">
Skirt:
</string>
<string
@@ -150,8 +150,12 @@ left="0"
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,13 +164,63 @@ 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" />
+ width="150" />
+ <radio_group
+ control_name="AvatarSex"
+ follows="left|top|right"
+ left="210"
+ height="20"
+ layout="topleft"
+ 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" />
<text_editor
follows="all"
height="23"
@@ -174,20 +228,23 @@ left="0"
layout="topleft"
max_length="300"
name="description"
+ top_pad="3"
width="290" />
</panel>
<panel
follows="all"
- height="400"
+ height="408"
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="408"
layout="topleft"
left="0"
name="edit_shape_panel"
@@ -201,7 +258,7 @@ left="0"
layout="topleft"
left="0"
name="edit_skin_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
@@ -211,7 +268,7 @@ left="0"
layout="topleft"
left="0"
name="edit_hair_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
@@ -221,7 +278,7 @@ left="0"
layout="topleft"
left="0"
name="edit_eyes_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
@@ -231,7 +288,7 @@ left="0"
layout="topleft"
left="0"
name="edit_shirt_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
@@ -241,7 +298,7 @@ left="0"
layout="topleft"
left="0"
name="edit_pants_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
@@ -251,7 +308,7 @@ left="0"
layout="topleft"
left="0"
name="edit_shoes_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
@@ -261,7 +318,7 @@ left="0"
layout="topleft"
left="0"
name="edit_socks_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
@@ -271,7 +328,7 @@ left="0"
layout="topleft"
left="0"
name="edit_jacket_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
@@ -281,7 +338,7 @@ left="0"
layout="topleft"
left="0"
name="edit_skirt_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
@@ -291,7 +348,7 @@ left="0"
layout="topleft"
left="0"
name="edit_gloves_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
@@ -301,7 +358,7 @@ left="0"
layout="topleft"
left="0"
name="edit_undershirt_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
@@ -311,7 +368,7 @@ left="0"
layout="topleft"
left="0"
name="edit_underpants_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
@@ -321,7 +378,7 @@ left="0"
layout="topleft"
left="0"
name="edit_alpha_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
@@ -331,34 +388,93 @@ left="0"
layout="topleft"
left="0"
name="edit_tattoo_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
</panel>
+ <panel
+ follows="bottom|left|right"
+ height="25"
+ label="gear_buttom_panel"
+ layout="topleft"
+ left="0"
+ name="gear_buttom_panel"
+ top_pad="0"
+ width="333">
+ <button
+ follows="bottom|left"
+ tool_tip="Options"
+ height="25"
+ image_hover_unselected="Toolbar_Left_Over"
+ image_disabled="OptionsMenu_Disabled"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Left_Selected"
+ image_unselected="Toolbar_Left_Off"
+ layout="topleft"
+ left="10"
+ name="friends_viewsort_btn"
+ top="0"
+ 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"
+ image_disabled="AddItem_Disabled"
+ layout="topleft"
+ left_pad="1"
+ name="add_btn"
+ tool_tip="TODO"
+ width="31" />
+ <icon
+ follows="bottom|left|right"
+ height="25"
+ image_name="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="1"
+ name="dummy_right_icon"
+ width="218" >
+ </icon>
+ <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"
+ image_disabled="TrashItem_Disabled"
+ layout="topleft"
+ left_pad="1"
+ name="del_btn"
+ tool_tip="TODO"
+ width="31" />
+ </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 f913c58cc9..e79ae34627 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -28,6 +28,7 @@ Hover your mouse over the options for more help.
width="304"
layout="topleft">
<texture_picker
+ default_image_name="Generic_Group_Large"
follows="left|top"
height="110"
label=""
@@ -241,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 Mature -
+ </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 701a14e1c5..789d69bc68 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
@@ -98,6 +98,7 @@ background_visible="true"
left="0"
top="0"
single_expansion="true"
+ fit_parent="true"
follows="all"
layout="topleft"
name="groups_accordion">
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 7996a89e72..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
@@ -17,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>
@@ -262,6 +266,7 @@
top="0"
width="313">
<text_editor
+ enabled="false"
type="string"
follows="all"
height="200"
@@ -286,6 +291,7 @@
top="0"
width="313">
<text_editor
+ enabled="false"
type="string"
follows="all"
height="185"
@@ -329,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 731b3c119c..19fe2ea874 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -131,6 +131,7 @@ Maximum 200 per group daily
Subject:
</text>
<line_editor
+ follows="left|top|right"
border_style="line"
border_thickness="1"
height="16"
@@ -153,6 +154,7 @@ Maximum 200 per group daily
Message:
</text>
<text_editor
+ follows="left|top|right"
height="90"
layout="topleft"
left_pad="3"
@@ -173,6 +175,7 @@ Maximum 200 per group daily
Attach:
</text>
<line_editor
+ follows="left|top|right"
enabled="false"
height="19"
layout="topleft"
@@ -207,9 +210,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"
@@ -222,12 +239,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 19c0da4f08..0eb5c47f85 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -385,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">
@@ -408,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">
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 88566ea037..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,26 +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"/>
+ 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">
+ width="114">
<layout_panel
mouse_opaque="false"
auto_resize="true"
@@ -31,7 +31,7 @@
layout="topleft"
left="2"
min_height="0"
- width="100"
+ width="109"
top="0"
name="spacer"
user_resize="false" />
@@ -41,7 +41,7 @@
height="20"
layout="topleft"
min_height="20"
- width="100"
+ width="109"
name="view_profile_btn_panel"
user_resize="false">
<button
@@ -50,7 +50,7 @@
label="Profile"
name="view_profile_btn"
top="0"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -58,7 +58,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="add_friend_btn_panel"
user_resize="false">
<button
@@ -67,7 +67,7 @@
label="Add Friend"
name="add_friend_btn"
top="5"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -75,7 +75,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="teleport_btn_panel"
user_resize="false">
<button
@@ -85,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"
@@ -93,7 +93,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="share_btn_panel"
user_resize="false">
<button
@@ -102,7 +102,7 @@
height="23"
label="Share"
name="share_btn"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -110,7 +110,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="pay_btn_panel"
user_resize="false">
<button
@@ -119,7 +119,7 @@
height="23"
label="Pay"
name="pay_btn"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -127,7 +127,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="call_btn_panel"
user_resize="false">
<button
@@ -135,7 +135,7 @@
height="23"
label="Call"
name="call_btn"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -143,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"
@@ -160,7 +160,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="voice_ctrls_btn_panel"
user_resize="false"
visible="false">
@@ -169,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_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 befeb182f9..31ba539c44 100644
--- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -133,6 +133,7 @@
layout="topleft"
left="10"
name="description"
+ textbox.label="More"
top_pad="10"
value="Du waltz die spritz"
width="280" />
diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml
index ee8bca6f83..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="false"
background_visible="true"
- bg_alpha_color="DkGray2"
+ bg_alpha_color="DkGray"
follows="all">
<accordion
+ background_visible="true"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
follows="all"
- height="360"
+ height="373"
layout="topleft"
- left="0"
+ left="3"
name="landmarks_accordion"
top="0"
- width="380">
+ width="307">
<accordion_tab
layout="topleft"
name="tab_favorites"
@@ -33,7 +36,7 @@
mouse_opaque="true"
name="favorites_list"
start_folder="Favorites"
- width="380"/>
+ width="307"/>
</accordion_tab>
<accordion_tab
layout="topleft"
@@ -49,7 +52,7 @@
mouse_opaque="true"
name="landmarks_list"
start_folder="Landmarks"
- width="380"/>
+ width="307"/>
</accordion_tab>
<accordion_tab
layout="topleft"
@@ -65,7 +68,7 @@
mouse_opaque="true"
name="my_inventory_list"
start_folder="My Inventory"
- width="380"/>
+ width="307"/>
</accordion_tab>
<accordion_tab
layout="topleft"
@@ -81,55 +84,64 @@
mouse_opaque="true"
name="library_list"
start_folder="LIBRARY"
- width="380"/>
+ width="313"/>
</accordion_tab>
</accordion>
<panel
- bg_opaque_color="DkGray2"
- bg_alpha_color="DkGray2"
- background_visible="true"
- background_opaque="true"
+ background_visible="true"
bevel_style="none"
bottom="0"
follows="left|right|bottom"
- height="38"
+ 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="14"
- 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="10"
+ 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="-8"
+ left_pad="1"
name="trash_btn"
tool_tip="Remove selected landmark"
- top="14"
- 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..a86762f53d 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"
@@ -170,6 +149,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 50983d2976..d65b86f007 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -1,488 +1,193 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
background_visible="true"
+ default_tab_group="1"
follows="all"
- height="408"
+ 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>
- <menu_bar
- bg_visible="false"
- follows="left|top|right"
- height="20"
- 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>
- <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="26"
- width="303" />
- <tab_container
- bg_opaque_color="DkGray2"
- bg_alpha_color="DkGray2"
- background_visible="true"
- background_opaque="true"
-follows="all"
-halign="center"
- height="305"
+ <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="6"
+ left="7"
name="inventory filter tabs"
tab_height="30"
+ tab_group="1"
tab_position="top"
tab_min_width="100"
top_pad="10"
- width="315">
- <inventory_panel
- bg_opaque_color="DkGray2"
- bg_alpha_color="DkGray2"
- background_visible="true"
- background_opaque="true"
- border="false"
- bevel_style="none"
- follows="all"
- height="295"
- label="MY INVENTORY"
- help_topic="my_inventory_tab"
- layout="topleft"
- left="0"
- name="All Items"
- sort_order_setting="InventorySortOrder"
- top="16"
- width="290" />
- <inventory_panel
- bg_opaque_color="DkGray2"
- bg_alpha_color="DkGray2"
- background_visible="true"
- background_opaque="true"
- border="false"
- bevel_style="none"
- follows="all"
- height="295"
- label="RECENT"
- help_topic="recent_inventory_tab"
- layout="topleft"
- left_delta="0"
- name="Recent Items"
- width="290" />
- </tab_container>
-
- <panel
- bg_opaque_color="DkGray2"
- bg_alpha_color="DkGray2"
- background_visible="true"
- background_opaque="true"
+ width="312">
+ <inventory_panel
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ border="false"
bevel_style="none"
- follows="left|right|bottom"
- height="38"
+ follows="all"
+ height="338"
+ label="MY INVENTORY"
+ help_topic="my_inventory_tab"
layout="topleft"
- top_pad="-1"
- left="9"
- name="bottom_panel"
- width="310">
- <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="8"
- name="options_gear_btn"
- top="14"
- width="18" />
- <button
- follows="bottom|left"
- height="18"
- image_selected="AddItem_Press"
- image_unselected="AddItem_Off"
- image_disabled="AddItem_Disabled"
- layout="topleft"
- left_pad="10"
- name="add_btn"
- 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="-7"
- name="trash_btn"
- tool_tip="Remove selected item"
- top="14"
- width="18" />
- </panel>
-
-
+ left="0"
+ name="All Items"
+ sort_order_setting="InventorySortOrder"
+ 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_delta="0"
+ name="Recent Items"
+ 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_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 4112b65635..841a4f5713 100644
--- a/indra/newview/skins/default/xui/en/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml
@@ -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">
@@ -395,14 +401,6 @@
name="edit_profile_btn"
tool_tip="Edit your personal information"
width="152" />
- <button
- follows="bottom|right"
- height="23"
- label="Edit Appearance"
- left_pad="3"
- name="edit_appearance_btn"
- tool_tip="Create/edit your appearance: physical data, clothes and etc."
- width="153" />
</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 a314cedc21..96c76576c0 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -66,6 +66,7 @@
<button
follows="left|top"
height="23"
+ image_bottom_pad="1"
image_overlay="Home_Off"
layout="topleft"
left_pad="7"
@@ -118,7 +119,7 @@
commit_on_focus_lost="false"
follows="right|top"
halign="right"
- height="22"
+ height="23"
label="Search"
layout="topleft"
right="-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 1d99de1fa7..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,7 +7,7 @@
left="0"
name="chat_bar"
top="21"
- width="310">
+ width="308">
<line_editor
border_style="line"
border_thickness="1"
@@ -16,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
index 7c0ce9e62e..f5a78fc929 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_media.xml
@@ -2,34 +2,34 @@
<panel
can_resize="true"
can_close="false"
- mouse_opaque="true"
- bg_opaque_image="Volume_Background"
- bg_alpha_image="Volume_Background"
- background_opaque="true"
+ bg_opaque_image="Volume_Background"
+ bg_alpha_image="Volume_Background"
+ background_opaque="true"
background_visible="true"
layout="topleft"
- width="270"
- height="235"
+ 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"
+ background_visible="false"
follows="left|right|top"
top="0"
- height="30"
+ height="35"
name="minimized_controls"
left="0">
<button
name="all_nearby_media_disable_btn"
follows="left"
tool_tip="Turn all nearby media off"
- left="15"
- width="60"
+ left="8"
+ width="95"
height="22"
label="Stop All">
<button.commit_callback
@@ -40,7 +40,7 @@
follows="left"
tool_tip="Turn all nearby media on"
left_pad="4"
- width="60"
+ width="95"
height="22"
label="Start All">
<button.commit_callback
@@ -64,19 +64,31 @@
function="MediaListCtrl.GoMediaPrefs" />
</button>
<button
- name="more_less_btn"
+ name="more_btn"
follows="right"
tool_tip="Advanced Controls"
top_delta="0"
- right="-10"
- width="60"
+ right="-8"
+ width="66"
height="22"
- toggle="true"
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"
@@ -130,10 +142,9 @@
<combo_box.item
label="On other Avatars"
value="4"
- ame="OnOthers" />
+ name="OnOthers" />
</combo_box>
<scroll_list
- name="media_list"
follows="left|top|bottom|right"
column_padding="0"
height="105"
@@ -142,7 +153,8 @@
bg_stripe_color="0.25 0.25 0.25 0.25"
top_pad="8"
left="10"
- right="-10">
+ right="-10"
+ name="media_list">
<scroll_list.columns
type="checkbox"
width="-1"
@@ -187,12 +199,14 @@
height="26"
layout="topleft"
top="4"
- left="10"
+ 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"
@@ -220,6 +234,7 @@
</layout_panel>
<layout_panel
name="play"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
@@ -247,6 +262,7 @@
</layout_panel>
<layout_panel
name="pause"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
@@ -273,6 +289,7 @@
</layout_panel>
<layout_panel
name="volume_slider_ctrl"
+ mouse_opaque="false"
auto_resize="true"
user_resize="false"
follows="left|right"
@@ -297,6 +314,7 @@
</layout_panel>
<layout_panel
name="mute"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
@@ -325,6 +343,7 @@
</layout_panel>
<layout_panel
name="zoom"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
@@ -352,6 +371,7 @@
</layout_panel>
<layout_panel
name="unzoom"
+ mouse_opaque="false"
auto_resize="false"
user_resize="false"
layout="topleft"
@@ -380,6 +400,7 @@
<layout_panel
name="right_bookend"
width="0"
+ mouse_opaque="false"
user_resize="false" />
</layout_stack>
</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_toast.xml b/indra/newview/skins/default/xui/en/panel_online_status_toast.xml
index 14cb5fffee..b1a7697e83 100644
--- a/indra/newview/skins/default/xui/en/panel_online_status_toast.xml
+++ b/indra/newview/skins/default/xui/en/panel_online_status_toast.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
background_visible="false"
- height="152"
+ height="40"
label="friend_online_status"
layout="topleft"
left="0"
name="friend_online_status"
top="0"
- width="305">
+ width="220">
<avatar_icon
follows="top|left"
height="18"
@@ -21,7 +21,7 @@
<text
font="SansSerifSmall"
follows="all"
- height="137"
+ height="13"
layout="topleft"
left_pad="5"
name="message"
@@ -29,7 +29,7 @@
top="15"
use_ellipses="true"
value=""
- width="285"
+ 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..bc984ccc44
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -0,0 +1,481 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Side tray Outfit Edit panel -->
+<panel
+ background_visible="true"
+ border="false"
+ height="600"
+ follows="all"
+ label="Outfit Edit"
+ layout="topleft"
+ 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"/>
+
+ <!--
+ TODO remove this button. Added it temporary for QA to be able to test new edit wearable
+ panel (see EXT-6564)
+ -->
+ <button
+ follows="left|top|right"
+ height="20"
+ label="edit"
+ left="0"
+ top="0"
+ layout="topleft"
+ name="edit_wearable_btn"
+ width="40" />
+
+ <button
+ follows="top|left"
+ height="23"
+ image_overlay="BackArrow_Off"
+ layout="topleft"
+ name="back_btn"
+ left="5"
+ tab_stop="false"
+ top="2"
+ width="23" />
+ <text
+ follows="top|right"
+ font="SansSerifHugeBold"
+ height="26"
+ layout="topleft"
+ left_pad="20"
+ 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"
+ label="bottom_panel"
+ 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="38"
+ label="bottom_panel"
+ 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="270" />
+ <text
+ follows="bottom|left|right"
+ font="SansSerifLargeBold"
+ height="26"
+ layout="topleft"
+ name="curr_outfit_name"
+ text_color="LtGray"
+ top_pad="2"
+ value="[Current Outfit]"
+ use_ellipses="true"
+ width="270" />
+ </panel>
+ </panel>
+
+
+<!-- LIST OF WEARABLES (CURRENT OUTFIT/ WEARABLES TO ADD) -->
+<!-- *NOTE: border_size is used to calculate space between layout panel and for resize bar height
+required height for dragbar is 10, so resizebar height should be 10 px.
+It is calculated as border_size + 2*UIResizeBarOverlap
+-->
+ <layout_stack
+ animate="false"
+ border_size="8"
+ clip="false"
+ default_tab_group="2"
+ follows="all"
+ height="495"
+ width="313"
+ layout="topleft"
+ orientation="vertical"
+ name="im_panels"
+ tab_group="1"
+ top_pad="5"
+ left="5">
+ <layout_panel
+ layout="topleft"
+ height="220"
+ label="IM Control Panel"
+ min_height="100"
+ name="outfit_wearables_panel"
+ width="313"
+ auto_resize="true"
+ user_resize="true">
+
+ <!-- List containing items from the COF and Base outfit -->
+ <panel
+ background_visible="false"
+ class="cof_wearables"
+ filename="panel_cof_wearables.xml"
+ follows="left|top|right|bottom"
+ height="193"
+ layout="topleft"
+ left="1"
+ name="cof_wearables_list"
+ top="0"
+ width="311" />
+
+ <!-- Button bar -->
+ <panel
+ background_visible="true"
+ bevel_style="none"
+ follows="bottom|left|right"
+ height="27"
+ label="bottom_panel"
+ layout="topleft"
+ left="0"
+ name="edit_panel"
+ top="193"
+ 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="281" />
+ </panel>
+ </layout_panel>
+
+
+ <layout_panel
+ background_visible="true"
+ bg_alpha_color="DkGray2"
+ auto_resize="true"
+ default_tab_group="3"
+ height="211"
+ min_height="210"
+ name="add_wearables_panel"
+ width="313"
+ tab_group="2"
+ user_resize="true"
+ visible="false">
+ <icon
+ follows="left|top|right"
+ height="10"
+ image_name="Dragbar"
+ left="0"
+ top_pad="-9"
+ width="313" />
+ <text
+ follows="top|left|right"
+ font="SansSerifBold"
+ height="13"
+ layout="topleft"
+ left="5"
+ name="add_to_outfit_label"
+ text_color="LtGray"
+ top="4"
+ value="Add to Outfit:"
+ use_ellipses="true"
+ width="150" />
+ <button
+ follows="top|right"
+ height="20"
+ image_overlay="Search_Icon"
+ is_toggle="true"
+ layout="topleft"
+ left_pad="5"
+ name="filter_button"
+ top_delta="0"
+ width="20" />
+ <combo_box
+ follows="top|left|right"
+ height="20"
+ layout="topleft"
+ right="-5"
+ name="filter_wearables_combobox"
+ top_delta="0"
+ width="110"/>
+
+ <layout_stack
+ animate="true"
+ follows="all"
+ height="155"
+ width="313"
+ layout="topleft"
+ name="filter_panels"
+ top_pad="5"
+ left="0">
+ <layout_panel
+ auto_resize="false"
+ layout="topleft"
+ follows="left|top|right"
+ height="30"
+ label="IM Control Panel"
+ name="filter_panel"
+ width="311"
+ user_resize="false"
+ visible="false">
+ <filter_editor
+ background_image="TextField_Search_Off"
+ enabled="true"
+ follows="left|top|right"
+ font="SansSerif"
+ label="Filter"
+ layout="topleft"
+ left="5"
+ width="290"
+ height="25"
+ name="look_item_filter"
+ text_color="black"
+ text_pad_left="25"
+ visible="true"/>
+ </layout_panel>
+ <layout_panel
+ auto_resize="true"
+ background_visible="true"
+ bg_alpha_color="0.107 0.107 0.107 1"
+ height="145"
+ min_width="130"
+ name="inventory_panel"
+ width="311"
+ user_resize="true">
+ <inventory_panel
+ allow_multi_select="true"
+ background_visible="false"
+ border="false"
+ follows="left|top|right|bottom"
+ height="140"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="inventory_items"
+ 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="140"
+ left="0"
+ mouse_opaque="false"
+ width="311"
+ top_delta="0"
+ visible="true">
+ <wearable_items_list
+ color="0.107 0.107 0.107 1"
+ name="filtered_wearables_list"
+ allow_select="true"
+ layout="topleft"
+ follows="all"
+ multi_select="true"
+ width="310"
+ height="140"
+ left="0"
+ top="0"/>
+ </panel>
+ </layout_panel>
+ </layout_stack>
+
+ <panel
+ background_visible="true"
+ bevel_style="none"
+ follows="left|right|bottom"
+ height="27"
+ label="add_wearables_button_bar"
+ layout="topleft"
+ left="0"
+ name="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="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>
+ </layout_panel>
+ </layout_stack>
+
+ <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="Revert"
+ layout="topleft"
+ name="revert_btn"
+ top="0"
+ 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 cc60b97f92..9e59651bd1 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,26 @@
border="false">
<tab_container
follows="all"
- height="490"
+ height="509"
layout="topleft"
- left="6"
+ left="7"
name="appearance_tabs"
tab_min_width="140"
tab_height="30"
tab_position="top"
halign="center"
- width="315">
- <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,53 +47,53 @@
mouse_opaque="true"
name="cof_tab"
start_folder="Current Outfit"
- width="313" />
+ width="315" />
</tab_container>
<panel
- bg_opaque_color="DkGray2"
- bg_alpha_color="DkGray2"
background_visible="true"
- background_opaque="true"
- follows="left|right|bottom"
- height="38"
+ follows="bottom|left|right"
+ height="57"
layout="topleft"
left="9"
- visible="true"
top_pad="-1"
- width="310" />
- <panel
- background_visible="false"
- follows="bottom|left"
- height="73"
- layout="topleft"
- left="9"
visible="true"
name="bottom_panel"
- top_pad="-38"
width="310">
<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="8"
+ left="1"
name="options_gear_btn"
- top="14"
- width="18" />
+ top="1"
+ width="31" />
+ <icon
+ follows="bottom|left|right"
+ height="25"
+ image_name="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="1"
+ name="dummy_icon"
+ width="241"
+ />
+
<dnd_button
follows="bottom|right"
- height="18"
- image_selected="TrashItem_Press"
- image_unselected="TrashItem_Off"
+ 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="-9"
+ left_pad="1"
name="trash_btn"
tool_tip="Remove selected item"
- top="14"
- width="18" />
+ width="31"/>
<button
follows="bottom|left"
height="23"
@@ -101,29 +101,18 @@
layout="topleft"
name="make_outfit_btn"
tool_tip="Save appearance as an outfit"
- top="43"
+ top_pad="6"
left="0"
width="153" />
<button
- follows="bottom|right"
+ follows="bottom|left|right"
height="23"
label="Wear"
layout="topleft"
name="wear_btn"
left_pad="3"
- top="43"
tool_tip="Wear selected outfit"
width="152" />
- <button
- follows="bottom|left"
- height="23"
- label="M"
- layout="topleft"
- right="-140"
- name="look_edit_btn"
- top="26"
- visible="false"
- width="20" />
</panel>
-</panel>
+</panel> \ No newline at end of file
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..5cf94c25d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
@@ -0,0 +1,25 @@
+<?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"
+ 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 13791a6d32..b79ef1e287 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -1,21 +1,28 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- Side tray panel -->
<panel
+ default_tab_group="1"
follows="all"
+ height="449"
label="People"
layout="topleft"
- height="449"
+ 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" />
@@ -23,23 +30,31 @@
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_groups_msg & group_list.no_filtered_groups_msg attributes.
+ *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="[secondlife:///app/search/groups Try finding the group in search?]" />
+ value="Didn't find what you're looking for? Try [secondlife:///app/search/groups/[SEARCH_TERM] Search]." />
<string
name="no_groups_msg"
- value="[secondlife:///app/search/groups Try searching for some groups to join.]" />
+ value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." />
<filter_editor
- text_pad_left="10"
follows="left|top|right"
height="23"
layout="topleft"
@@ -48,6 +63,7 @@
max_length="300"
name="filter_input"
text_color="Black"
+ text_pad_left="10"
top="3"
width="303" />
<tab_container
@@ -56,6 +72,7 @@
layout="topleft"
left="5"
name="tabs"
+ tab_group="1"
tab_min_width="70"
tab_height="30"
tab_position="top"
@@ -63,10 +80,10 @@
halign="center"
width="317">
<panel
- bg_opaque_color="DkGray2"
- bg_alpha_color="DkGray2"
- background_visible="true"
- background_opaque="true"
+ background_opaque="true"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ bg_opaque_color="DkGray"
follows="all"
height="383"
label="NEARBY"
@@ -78,56 +95,71 @@
width="313">
<avatar_list
allow_select="true"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
follows="all"
- height="345"
+ 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="38"
+ 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="10"
- 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="10"
+ left_pad="1"
name="add_friend_btn"
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
- bg_opaque_color="DkGray2"
- bg_alpha_color="DkGray2"
- background_visible="true"
- background_opaque="true"
+ background_opaque="true"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ bg_opaque_color="DkGray"
follows="all"
height="383"
label="MY FRIENDS"
@@ -138,13 +170,16 @@
top="0"
width="313">
<accordion
+ background_visible="true"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
follows="all"
- height="345"
+ height="356"
layout="topleft"
- left="0"
+ left="3"
name="friends_accordion"
top="0"
- width="313">
+ width="307">
<accordion_tab
layout="topleft"
height="172"
@@ -160,7 +195,7 @@
multi_select="true"
name="avatars_online"
top="0"
- width="313" />
+ width="307" />
</accordion_tab>
<accordion_tab
layout="topleft"
@@ -176,71 +211,80 @@
multi_select="true"
name="avatars_all"
top="0"
- width="313" />
+ width="307" />
</accordion_tab>
</accordion>
<panel
+ background_visible="true"
follows="left|right|bottom"
- height="38"
+ 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="10"
- 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="10"
+ left_pad="1"
name="add_btn"
tool_tip="Offer friendship to a Resident"
- 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="10"
- name="no_friends_msg"
+ left="13"
+ name="no_friends_help_text"
top="10"
width="293"
- wrap="true">
- To add friends try [secondlife:///app/search/people global search] or use right-click on a Resident to add them as a friend.
-If you're looking for people to hang out with, [secondlife:///app/worldmap try the Map].
- </text>
+ wrap="true" />
</panel>
<panel
- bg_opaque_color="DkGray2"
- bg_alpha_color="DkGray2"
- background_visible="true"
- background_opaque="true"
+ background_opaque="true"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ bg_opaque_color="DkGray"
follows="all"
height="383"
label="MY GROUPS"
@@ -255,65 +299,82 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t
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="345"
+ height="356"
layout="topleft"
- left="0"
+ left="3"
name="group_list"
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
+ background_visible="true"
follows="left|right|bottom"
- height="38"
+ 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="10"
- 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="10"
+ left_pad="1"
name="plus_btn"
tool_tip="Join group/Create new group"
- 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="10"
+ left_pad="1"
name="activate_btn"
tool_tip="Activate selected group"
- top_delta="4"
- 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
- bg_opaque_color="DkGray2"
- bg_alpha_color="DkGray2"
- background_visible="true"
- background_opaque="true"
+ background_opaque="true"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ bg_opaque_color="DkGray"
follows="all"
height="383"
label="RECENT"
@@ -325,50 +386,65 @@ 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="345"
+ 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
+ background_visible="true"
follows="left|right|bottom"
- height="38"
+ 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="10"
- 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="10"
+ 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>
@@ -377,7 +453,7 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t
height="23"
layout="topleft"
left="8"
- top_pad="0"
+ top_pad="4"
name="button_bar"
width="313">
<button
@@ -387,7 +463,8 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t
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"
left_pad="3"
@@ -396,7 +473,7 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t
layout="topleft"
name="im_btn"
tool_tip="Open instant message session"
- width="43" />
+ width="40" />
<button
follows="bottom|left"
left_pad="3"
@@ -413,7 +490,8 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t
label="Share"
layout="topleft"
name="share_btn"
- width="62" />
+ tool_tip="Share an inventory item"
+ width="65" />
<button
follows="bottom|left"
left_pad="3"
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 715dc5f23c..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
@@ -65,6 +65,7 @@
left="103"
name="picture_descr"
textbox.max_length="1024"
+ textbox.label="More"
textbox.show_context_menu="false"
top_pad="0"
width="178"
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 1e7c51259c..9725e9952a 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -275,6 +275,7 @@
layout="topleft"
left="5"
name="description"
+ textbox.label="More"
top_pad="10"
value="Du waltz die spritz"
width="300" />
@@ -320,6 +321,7 @@
follows="all"
height="223"
layout="topleft"
+ single_expansion="true"
left="0"
name="advanced_info_accordion"
top_pad="10"
@@ -353,7 +355,7 @@
left_pad="12"
name="rating_label"
value="Rating:"
- width="60" />
+ width="90" />
<text
follows="left|right|top"
height="16"
@@ -380,7 +382,7 @@
name="voice_label"
top_delta="0"
value="Voice:"
- width="60" />
+ width="90" />
<text
follows="left|right|top"
height="18"
@@ -406,7 +408,7 @@
left_pad="8"
name="fly_label"
value="Fly:"
- width="60" />
+ width="90" />
<text
follows="left|right|top"
height="16"
@@ -432,7 +434,7 @@
left_pad="8"
name="push_label"
value="Push:"
- width="60" />
+ width="90" />
<text
follows="left|right|top"
height="14"
@@ -458,7 +460,7 @@
left_pad="8"
name="build_label"
value="Build:"
- width="60" />
+ width="90" />
<text
follows="left|right|top"
height="15"
@@ -484,7 +486,7 @@
left_pad="8"
name="scripts_label"
value="Scripts:"
- width="60" />
+ width="90" />
<text
follows="left|right|top"
height="14"
@@ -510,7 +512,7 @@
left_pad="8"
name="damage_label"
value="Damage:"
- width="60" />
+ width="90" />
<text
follows="left|right|top"
height="14"
@@ -742,7 +744,6 @@
bg_focus_color="DkGray2"
bg_readonly_color="DkGray2"
follows="left|top|right"
- handle_edit_keys_directly="true"
height="90"
layout="topleft"
left="10"
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index ff5d89470c..a7a0efcdb3 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"
@@ -37,6 +38,7 @@ background_visible="true"
name="Places Tabs"
tab_min_width="80"
tab_height="30"
+ tab_group="1"
tab_position="top"
top_pad="10"
width="315" />
@@ -65,7 +67,7 @@ background_visible="true"
visible="false"
width="315" />
<panel
- height="19"
+ height="23"
layout="topleft"
left="4"
name="button_panel"
@@ -132,5 +134,14 @@ background_visible="true"
right="-10"
top="1"
width="60" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Profile"
+ layout="topleft"
+ name="profile_btn"
+ right="-1"
+ 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 4be4d6b432..40a644657a 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="1"
+ 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,7 @@ 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"
@@ -182,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"
@@ -189,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
@@ -243,6 +285,7 @@ Automatic position for:
top_pad="5"
width="200" />
<button
+ layout="topleft"
follows="top|left"
enabled_control="EnableVoiceChat"
height="23"
@@ -253,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"
@@ -267,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 3d434361b9..ba967d3e2c 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -330,28 +330,30 @@
<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
+ name="requires_restart_label"
follows="left|top"
layout="topleft"
top_delta="0"
- left="120"
+ left="170"
height="20"
- width="100"
+ width="130"
text_color="White_25"
>
(requires restart)
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 d11aebe943..9eaabbe77b 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -177,7 +177,7 @@
layout="topleft"
left="30"
name="start_location_textbox"
- top_pad="10"
+ top_pad="15"
width="394">
Start location:
</text>
@@ -256,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"
@@ -354,7 +343,7 @@
left="30"
mouse_opaque="false"
name="text_box3"
- top_pad="10"
+ top_pad="15"
width="240">
Busy mode response:
</text>
@@ -365,12 +354,12 @@
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 c74de043e9..266fd6cb5e 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,26 +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" />
+ 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"
@@ -387,13 +360,41 @@
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="2"
+ initial_value="35"
+ label="Max. avatar draw distance:"
+ label_width="185"
+ layout="topleft"
+ left_delta="0"
+ max_val="65"
+ min_val="1"
+ name="MaxAvatarDrawDistance"
+ top_pad="4"
+ width="290" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ left_delta="291"
+ name="DrawDistanceMeterText3"
+ top_delta="0"
+ width="128">
+ m
+ </text>
<slider
control_name="RenderGlowResolutionPow"
decimal_digits="0"
@@ -402,15 +403,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" />
@@ -434,14 +435,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" />
@@ -452,13 +453,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" />
@@ -470,13 +471,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" />
@@ -488,13 +489,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" />
@@ -506,7 +507,7 @@
increment="0.125"
initial_value="160"
label=" Terrain:"
- label_width="140"
+ label_width="185"
layout="topleft"
left_delta="0"
max_val="2"
@@ -514,7 +515,7 @@
name="TerrainMeshDetail"
show_text="false"
top_pad="4"
- width="223">
+ width="264">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="TerrainMeshDetailText" />
@@ -528,7 +529,7 @@
increment="8"
initial_value="160"
label=" Sky:"
- label_width="140"
+ label_width="185"
layout="topleft"
left_delta="0"
max_val="128"
@@ -536,7 +537,7 @@
name="SkyMeshDetail"
show_text="false"
top_pad="4"
- width="223">
+ width="264">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="SkyMeshDetailText" />
@@ -547,9 +548,9 @@
follows="left|top"
height="12"
layout="topleft"
- left="444"
+ left="469"
name="PostProcessText"
- top="305"
+ top="60"
width="128">
Low
</text>
@@ -632,9 +633,9 @@
follows="left|top"
height="12"
layout="topleft"
- left_delta="-230"
+ left="200"
name="LightingDetailText"
- top_pad="8"
+ top_pad="18"
width="140">
Lighting detail:
</text>
@@ -643,15 +644,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"
@@ -660,7 +659,6 @@
height="16"
label="Nearby local lights"
layout="topleft"
- left_delta="0"
name="LocalLights"
value="1"
top_delta="16"
@@ -672,9 +670,9 @@
follows="left|top"
height="12"
layout="topleft"
- left="358"
+ left_pad="-30"
name="TerrainDetailText"
- top="465"
+ top="226"
width="155">
Terrain detail:
</text>
@@ -686,23 +684,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 f232a69482..fca9b4bca1 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -69,15 +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" />
<text
type="string"
length="1"
@@ -93,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 e03ecd8f04..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,7 +14,7 @@
follows="left|top"
font.style="BOLD"
height="15"
- increment="0.05"
+ increment="0.025"
initial_value="0.5"
label="Master volume"
label_width="120"
@@ -57,7 +57,7 @@
disabled_control="MuteAudio"
follows="left|top"
height="15"
- increment="0.05"
+ increment="0.025"
initial_value="0.5"
label="Buttons"
label_width="120"
@@ -91,7 +91,7 @@
disabled_control="MuteAudio"
follows="left|top"
height="15"
- increment="0.05"
+ increment="0.025"
initial_value="0.5"
label="Ambient"
label_width="120"
@@ -125,7 +125,7 @@
disabled_control="MuteAudio"
follows="left|top"
height="15"
- increment="0.05"
+ increment="0.025"
initial_value="0.5"
label="Sound Effects"
label_width="120"
@@ -159,7 +159,7 @@
disabled_control="MuteAudio"
follows="left|top"
height="15"
- increment="0.05"
+ increment="0.025"
initial_value="0.5"
label="Streaming music"
label_width="120"
@@ -202,7 +202,7 @@
disabled_control="MuteAudio"
follows="left|top"
height="16"
- increment="0.05"
+ increment="0.025"
initial_value="0.5"
label="Media"
label_width="120"
@@ -247,7 +247,7 @@
disabled_control="MuteAudio"
follows="left|top"
height="16"
- increment="0.05"
+ increment="0.025"
initial_value="0.5"
label="Voice Chat"
label_width="120"
@@ -454,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"
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 6b5f0c3896..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"
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 412485e03f..d7a601d7a3 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -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"
@@ -289,6 +293,8 @@
left="7"
name="sl_groups"
textbox.max_length="512"
+ textbox.label="More"
+ textbox.show_context_menu="true"
top_pad="0"
translate="false"
width="290"
@@ -314,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"
@@ -325,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"
@@ -334,20 +343,12 @@
layout="topleft"
name="call"
tool_tip="Call this Resident"
- left_pad="3"
+ left_pad="1"
+ pad_left="1"
+ pad_right="1"
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"
- top="5"
- left_pad="3"
- width="41" />
+ use_ellipses="true"
+ width="51" />
<button
follows="bottom|left"
height="23"
@@ -355,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"
@@ -367,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
@@ -386,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_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 c5b2512fba..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="250">
+ 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 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_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml
index d444420550..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>
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..19eb4bb0d6 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,34 @@
<?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" />
+ top="120"
+ width="120" />
<text
follows="left|top"
height="16"
layout="topleft"
- left_pad="6"
+ left="155"
name="max param text"
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 +40,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 +84,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 +97,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 +110,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_stand_stop_flying.xml b/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml
index b48943c699..3effc9de89 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,7 +6,7 @@
name="panel_stand_stop_flying"
mouse_opaque="false"
visible="true"
- width="115">
+ width="113">
<button
follows="left|bottom"
height="19"
@@ -16,7 +16,7 @@
tool_tip="Click here to stand up."
top="2"
visible="false"
- width="115" />
+ width="113" />
<button
follows="left|bottom"
height="19"
@@ -26,5 +26,5 @@
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 0c870e155b..008aa1acc0 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -43,38 +43,43 @@
</panel.string>
<button
auto_resize="true"
- halign="right"
+ halign="center"
+ enabled="false"
font="SansSerifSmall"
follows="right|top"
image_overlay=""
- image_selected="spacer35.tga"
- image_unselected="spacer35.tga"
- image_pressed="spacer35.tga"
- height="16"
- right="-230"
+ image_selected="bevel_background"
+ image_unselected="bevel_background"
+ image_pressed="bevel_background"
+ height="18"
+ right="-275"
label_shadow="false"
name="buycurrency"
+ label_color_disabled="ButtonLabelColor"
+ image_color_disabled="White"
tool_tip="My Balance"
- top="3"
- width="120" />
+ pad_left="12"
+ pad_right="12"
+ top="0"
+ 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"
- label_color="EmphasisColor"
+ 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"
+ top="0"
width="55" />
<text
type="string"
@@ -88,16 +93,16 @@
left_pad="0"
name="TimeText"
tool_tip="Current time (Pacific)"
- width="100">
+ width="145">
24:00 AM PST
</text>
<button
follows="right|top"
height="16"
- image_selected="Pause_Off"
- image_unselected="Play_Off"
- image_pressed="Play_Press"
- image_pressed_selected="Pause_Press"
+ 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"
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 0d4f67f94c..21addb8e6f 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
@@ -1,17 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="Teleport History" bottom="0" height="400" left="0" width="380"
+<panel name="Teleport History" bottom="0" height="400" left="0" width="313"
help_topic="panel_teleport_history"
- border="false" follows="left|top|right|bottom">
+ border="false" follows="left|top|right|bottom"
+ background_visible="true"
+ bg_alpha_color="DkGray">
<accordion
follows="left|top|right|bottom"
- height="368"
+ height="373"
layout="topleft"
- left="0"
+ left="3"
top="0"
name="history_accordion"
background_visible="true"
bg_alpha_color="DkGray2"
- width="380">
+ width="307">
<accordion_tab
layout="topleft"
name="today"
@@ -23,7 +25,7 @@
left="0"
name="today_items"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
<accordion_tab
@@ -37,7 +39,7 @@
left="0"
name="yesterday_items"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
<accordion_tab
@@ -51,7 +53,7 @@
left="0"
name="2_days_ago"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
<accordion_tab
@@ -65,7 +67,7 @@
left="0"
name="3_days_ago"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
<accordion_tab
@@ -79,7 +81,7 @@
left="0"
name="4_days_ago"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
<accordion_tab
@@ -93,7 +95,7 @@
left="0"
name="5_days_ago_items"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
<accordion_tab
@@ -107,7 +109,7 @@
left="0"
name="6_days_and_older_items"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
<accordion_tab
@@ -121,7 +123,7 @@
left="0"
name="1_month_and_older_items"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
<accordion_tab
@@ -135,34 +137,41 @@
left="0"
name="6_months_and_older_items"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
</accordion>
<panel
- bg_opaque_color="DkGray2"
- bg_alpha_color="DkGray2"
- background_visible="true"
- background_opaque="true"
+ background_visible="true"
bevel_style="none"
bottom="0"
follows="left|right|bottom"
- height="38"
+ 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="gear_btn"
- top="14"
- 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 11069b3ac3..92b4c17247 100644
--- a/indra/newview/skins/default/xui/en/panel_toast.xml
+++ b/indra/newview/skins/default/xui/en/panel_toast.xml
@@ -55,7 +55,7 @@
clip_partial="true"
visible="false"
follows="left|top|right|bottom"
- font="SansSerifBold"
+ font="SansSerif"
height="20"
layout="topleft"
left="20"
@@ -64,7 +64,6 @@
text_color="white"
top="5"
translate="false"
- v_pad="5"
use_ellipses="true"
width="260">
Toast text;
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 cd66c56ca1..7b22b2cce1 100644
--- a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
+++ b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
@@ -32,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 b3d55fec65..5a6b3ec096 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,63 +15,93 @@ 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="24"
+ height="32"
image_name="TabIcon_Appearance_Off"
name="outfit_icon"
mouse_opaque="false"
visible="true"
- left="9"
+ left="0"
top="0"
- width="24" />
+ width="32" />
+ <text
+ 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="SansSerifHugeBold"
+ font="SansSerifLargeBold"
height="20"
- left_pad="5"
- text_color="LtGray"
- top="0"
+ 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="20"
+ image_overlay="Edit_Wrench"
+ label=""
layout="topleft"
- top_pad="5"
- mouse_opaque="false"
- name="currentlook_title" >
- (unsaved)
- </text>
+ left="265"
+ name="edit_outfit_btn"
+ 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"
@@ -86,10 +117,12 @@ width="333">
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"
+ tab_group="1"
top_pad="6"
follows="all" />
<!-- <button
@@ -102,14 +135,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="5"
+ visible="false"
+ width="320"/>
<panel
class="panel_edit_wearable"
filename="panel_edit_wearable.xml"
@@ -117,6 +153,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 a233d42568..4c42d1f750 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -46,17 +46,37 @@
left="0"
name="info_btn"
top="0"
- width="153" />
+ width="102" />
+ <button
+ enabled="true"
+ follows="bottom|left"
+ height="23"
+ label="Share"
+ layout="topleft"
+ left="105"
+ name="share_btn"
+ top="0"
+ width="102" />
+ <button
+ enabled="true"
+ follows="bottom|left"
+ height="23"
+ label="Shop"
+ layout="topleft"
+ left="210"
+ name="shop_btn"
+ top="0"
+ width="102" />
<button
enabled="false"
follows="bottom|left"
height="23"
label="Wear"
layout="topleft"
- left="156"
+ left="210"
name="wear_btn"
top="0"
- width="152" />
+ width="102" />
<button
enabled="false"
follows="bottom|left"
@@ -64,19 +84,19 @@
label="Play"
layout="topleft"
name="play_btn"
- left="156"
+ left="210"
top="0"
- width="152" />
+ width="102" />
<button
enabled="false"
follows="bottom|left"
height="23"
label="Teleport"
layout="topleft"
- left="156"
+ left="210"
name="teleport_btn"
top="0"
- width="152" />
+ 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 12c06504ca..b840fdd31b 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -403,7 +403,7 @@ top_pad="10"
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 433b7691fa..d46783e058 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -303,7 +303,7 @@
follows="left|top|right"
layout="topleft"
name="perm_modify"
- width="200">
+ width="310">
You can modify this object
</text>
<text
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 485db0080d..e57b30185d 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,28 @@
<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 administr\
+ator.</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 administrat
+or.</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 +90,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>
@@ -84,9 +112,18 @@
<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>
@@ -120,6 +157,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>
@@ -134,6 +173,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>
@@ -158,6 +198,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>
@@ -1770,6 +1811,20 @@ 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>
@@ -1810,7 +1865,8 @@ 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. Try [secondlife:///app/search/groups "Search"].</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 -->
@@ -1823,6 +1879,7 @@ Clears (deletes) the media and all params from the given face.
<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>
@@ -1837,6 +1894,7 @@ Clears (deletes) the media and all params from the given face.
<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 -->
@@ -1879,6 +1937,7 @@ Clears (deletes) the media and all params from the given face.
<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>
@@ -2108,20 +2167,22 @@ Clears (deletes) the media and all params from the given face.
<!-- 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) " />
@@ -2170,7 +2231,8 @@ Clears (deletes) the media and all params from the given face.
<!-- 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
@@ -2861,6 +2923,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">
@@ -2894,6 +2959,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>
@@ -2906,8 +2975,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...
@@ -3018,4 +3089,98 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="session_initialization_timed_out_error">
The session initialization is timed out
</string>
-</strings>
+
+ <!-- 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="server_is_down">
+ Despite our best efforts, something unexpected has gone wrong.
+
+ Please check secondlife.com/status to see if there is a known problem with the service.
+ </string>
+
+ </strings>
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/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 1d61447e31..02ea661da3 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -6,6 +6,8 @@
<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"
@@ -43,7 +45,7 @@
scale_image="false"
top="19"
left="-3" />
- <maturity_icon
+ <maturity_button
name="maturity_icon"
width="18"
height="16"
diff --git a/indra/newview/skins/default/xui/en/widgets/text.xml b/indra/newview/skins/default/xui/en/widgets/text.xml
index 855584a0db..998ec5b170 100644
--- a/indra/newview/skins/default/xui/en/widgets/text.xml
+++ b/indra/newview/skins/default/xui/en/widgets/text.xml
@@ -15,6 +15,7 @@
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/es/floater_about.xml b/indra/newview/skins/default/xui/es/floater_about.xml
index cb1aa5eaa1..1af089cfaf 100644
--- a/indra/newview/skins/default/xui/es/floater_about.xml
+++ b/indra/newview/skins/default/xui/es/floater_about.xml
@@ -29,7 +29,7 @@ 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 de Vivox: [VIVOX_VERSION]
+Versión del servidor de voz: [VOICE_VERSION]
</floater.string>
<floater.string name="none">
(no hay)
@@ -43,19 +43,14 @@ Versión de Vivox: [VIVOX_VERSION]
</panel>
<panel label="Créditos" name="credits_panel">
<text_editor name="credits_editor">
- Te 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 y muchos otros.
+ 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 los siguientes Residentes por ayudarnos a estar seguros de que, hoy por hoy, esta es la mejor versión: (pendiente)
+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.
-
-
-
-
-No es frecuente la mente que puede hacer que lo que hasta ahora no existía de pronto salte a la vista. Sí es frecuente -y engañoso- gritar &apos;A mí se me podía haber ocurrido eso&apos;, pero el hecho es que no se hizo, un hecho muy significativo y revelador.
- -- Douglas Adams
+&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">
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 46531c5e58..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,5 +1,14 @@
<?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>
@@ -15,7 +24,7 @@
<tab_container name="landtab">
<panel label="GENERAL" name="land_general_panel">
<panel.string name="new users only">
- Sólo usuarios nuevos
+ Sólo nuevos Residentes
</panel.string>
<panel.string name="anyone">
Cualquiera
@@ -54,6 +63,9 @@
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>
@@ -84,9 +96,9 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
<text name="GroupText">
Leyla Linden
</text>
- <button label="Configurar..." label_selected="Configurar..." name="Set..."/>
+ <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:
@@ -97,7 +109,7 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
<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>
@@ -107,7 +119,7 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
<text name="Selling with no objects in parcel." width="216">
Los objetos no se incluyen en la venta.
</text>
- <button bottom="-245" font="SansSerifSmall" label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" left="275" name="Cancel Land Sale" width="165"/>
+ <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>
@@ -126,13 +138,13 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
<text name="DwellText">
0
</text>
- <button label="Comprar terreno..." label_selected="Comprar terreno..." left="130" name="Buy Land..." width="125"/>
+ <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..." label_selected="Comprar para el grupo..." name="Buy For Group..."/>
- <button label="Comprar un pase..." label_selected="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..." 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."/>
+ <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">
@@ -198,10 +210,10 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
</panel>
<panel label="OBJETOS" name="land_objects_panel">
<panel.string name="objects_available_text">
- [COUNT] de un máximo de [MAX] ([AVAILABLE] disponibles)
+ [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
</panel.string>
<panel.string name="objects_deleted_text">
- [COUNT] de un máximo de [MAX] ([DELETED] se borrarán)
+ [COUNT] de un máx. de [MAX] ([DELETED] se borrarán)
</panel.string>
<text name="parcel_object_bonus">
Plus de objetos en la región: [BONUS]
@@ -210,7 +222,7 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
Uso de primitivas:
</text>
<text left="204" name="objects_available" width="250">
- [COUNT] de un máximo de [MAX] ([AVAILABLE] disponibles)
+ [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
</text>
<text name="Primitives parcel supports:" width="200">
Prims que admite la parcela:
@@ -231,7 +243,7 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
[COUNT]
</text>
<button label="Mostrar" label_selected="Mostrar" name="ShowOwner" right="-135" width="60"/>
- <button label="Devolver..." label_selected="Devolver..." name="ReturnOwner..." right="-10" tool_tip="Devolver los objetos a sus propietarios." width="119"/>
+ <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>
@@ -239,7 +251,7 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
[COUNT]
</text>
<button label="Mostrar" label_selected="Mostrar" name="ShowGroup" right="-135" width="60"/>
- <button label="Devolver..." label_selected="Devolver..." name="ReturnGroup..." right="-10" tool_tip="Devolver los objetos a sus propietarios." width="119"/>
+ <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>
@@ -247,26 +259,26 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
[COUNT]
</text>
<button label="Mostrar" label_selected="Mostrar" name="ShowOther" right="-135" width="60"/>
- <button label="Devolver..." label_selected="Devolver..." name="ReturnOther..." right="-10" tool_tip="Devolver los objetos a sus propietarios." width="119"/>
+ <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 left="204" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text left="4" name="Autoreturn" width="412">
- Devolución automática de objetos de otros Residentes (minutos, 0 para desactivarla):
+ <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"/>
<text name="Object Owners:" width="150">
Propietarios de los objetos:
</text>
<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..." label_selected="Devolver los objetos..." left="270" name="Return objects..." width="164"/>
+ <button label="Devolver los objetos" left="270" name="Return objects..." width="164"/>
<name_list name="owner list">
<name_list.columns label="Tipo" name="type"/>
<name_list.columns label="Nombre" name="name"/>
- <name_list.columns label="Número" name="count"/>
+ <name_list.columns label="Núm." name="count"/>
<name_list.columns label="Más recientes" name="mostrecent"/>
</name_list>
</panel>
@@ -307,28 +319,28 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
</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 left="162" name="allow_label2">
+ <text name="allow_label2">
Crear objetos:
</text>
- <check_box label="Todos los residentes" left="255" name="edit objects check"/>
- <check_box label="El grupo" left="385" name="edit group objects check"/>
- <text left="162" name="allow_label3">
+ <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" left="255" name="all object entry check"/>
- <check_box label="El grupo" left="385" name="group object entry check"/>
- <text left="162" name="allow_label4">
+ <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" left="255" name="check other scripts"/>
- <check_box label="El grupo" left="385" name="check group scripts"/>
+ <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 left="282" name="land category with adult" width="140">
+ <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"/>
@@ -343,7 +355,7 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
<combo_box.item label="Compras" name="item11"/>
<combo_box.item label="Otra" name="item12"/>
</combo_box>
- <combo_box left="282" name="land category" width="140">
+ <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"/>
@@ -385,7 +397,7 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
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:
@@ -424,6 +436,9 @@ los media:
<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>
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 2fc18e55f6..d57405f7e5 100644
--- a/indra/newview/skins/default/xui/es/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/es/floater_animation_preview.xml
@@ -115,14 +115,14 @@ La duración máxima de una animación es de [MAX_LENGTH] segundos.
<text name="description_label">
Descripción:
</text>
- <spinner label="Prioridad:" label_width="72" name="priority" tool_tip="Controla qué otras animaciones pueden ser anuladas por ésta" width="110"/>
- <check_box label="Bucle:" left="8" name="loop_check" tool_tip="Hace esta animación en bucle"/>
- <spinner label="Empieza(%)" label_width="65" left="65" name="loop_in_point" tool_tip="Indica el punto en el que la animación vuelve a empezar" width="116"/>
- <spinner label="Acaba(%)" label_width="50" left="185" name="loop_out_point" tool_tip="Indica 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" name="hand_pose_combo" tool_tip="Controla qué hacen las manos durante la animación" width="164">
+ <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"/>
@@ -140,39 +140,39 @@ La duración máxima de una animación es de [MAX_LENGTH] segundos.
<text name="emote_label">
Expresión
</text>
- <combo_box left_delta="120" name="emote_combo" tool_tip="Controla qué hace la cara durante la animación" width="164">
- <combo_box.item label="(ninguno)" name="[None]"/>
- <combo_box.item label="Aaaaah" name="Aaaaah"/>
- <combo_box.item label="Con miedo" name="Afraid"/>
- <combo_box.item label="Enfado" name="Angry"/>
- <combo_box.item label="Gran sonrisa" name="BigSmile"/>
- <combo_box.item label="Aburrimiento" name="Bored"/>
- <combo_box.item label="Llorar" name="Cry"/>
- <combo_box.item label="Desdén" name="Disdain"/>
- <combo_box.item label="Avergonzarse" name="Embarrassed"/>
- <combo_box.item label="Fruncir el ceño" name="Frown"/>
- <combo_box.item label="Beso" name="Kiss"/>
- <combo_box.item label="Reír" name="Laugh"/>
- <combo_box.item label="Sacar la lengua" name="Plllppt"/>
- <combo_box.item label="Rechazo" name="Repulsed"/>
- <combo_box.item label="Triste" name="Sad"/>
- <combo_box.item label="Encogerse de hombros" name="Shrug"/>
- <combo_box.item label="Sonrisa" name="Smile"/>
- <combo_box.item label="Sorpresa" name="Surprise"/>
- <combo_box.item label="Guiño" name="Wink"/>
- <combo_box.item label="Preocupación" name="Worry"/>
+ <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" name="preview_base_anim" tool_tip="Compruebe cómo se comporta su animación a la vez que el avatar realiza acciones comunes." width="130">
- <combo_box.item label="De pie" name="Standing"/>
- <combo_box.item label="Caminando" name="Walking"/>
- <combo_box.item label="Sentado/a" name="Sitting"/>
- <combo_box.item label="Volando" name="Flying"/>
+ <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="Combinar (sec)" label_width="125" name="ease_in_time" tool_tip="Tiempo (en segundos) en el que se combinan las animaciones" width="192"/>
- <spinner bottom_delta="-20" label="Dejar de combinar (sec)" label_width="125" left="10" name="ease_out_time" tool_tip="Tiempo (en segundos) en el que dejan de combinarse las animaciones" width="192"/>
+ <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"/>
@@ -180,8 +180,7 @@ La duración máxima de una animación es de [MAX_LENGTH] segundos.
<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="Subir ([AMOUNT] L$)" name="ok_btn"/>
<button label="Cancelar" name="cancel_btn"/>
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 089ff3cd68..54ef34264c 100644
--- a/indra/newview/skins/default/xui/es/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/es/floater_avatar_textures.xml
@@ -3,41 +3,46 @@
<floater.string name="InvalidAvatar">
AVATAR NO VÃLIDO
</floater.string>
- <text name="composite_label">
- Texturas compuestas
- </text>
- <button label="Soltar" label_selected="Soltar" name="Dump"/>
<scroll_container name="profile_scroll">
<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: parte superior del cuerpo" 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: parte inferior del cuerpo" 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"/>
+ <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_build_options.xml b/indra/newview/skins/default/xui/es/floater_build_options.xml
index de8d205ad4..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,7 +1,7 @@
<?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)" label_width="192" name="GridResolution" width="250"/>
- <spinner label="Graduación de la cuadrícula (metros)" label_width="192" name="GridDrawSize" 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">
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 81c54cf600..a8fa030846 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
@@ -37,7 +37,7 @@
Calculando...
</text>
<text name="buy_action">
- [NAME] [PRICE] L$
+ [ACTION]
</text>
<text name="total_label">
Mi nuevo saldo será
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 496e719c6d..a40f65d5d0 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_land.xml
@@ -13,17 +13,17 @@
No puede unirse ni dividirse.
</floater.string>
<floater.string name="cant_buy_for_group">
- No tiene permiso de comprar terreno para el grupo que tiene activado.
+ 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éntelo seleccionando un área más pequeña.
+Inténtalo seleccionando un área más pequeña.
</floater.string>
<floater.string name="no_permission">
- No tiene permiso de comprar terreno para el grupo que tiene activado.
+ 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.
@@ -32,20 +32,20 @@ Inténtelo seleccionando un área más pequeña.
El grupo ya es propietario de la parcela.
</floater.string>
<floater.string name="you_already_own">
- Usted ya es propietario de la parcela.
+ 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
+ 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">
- Se ha seleccionado terreno propiedad de otro.
-Inténtelo seleccionando un área más pequeña.
+ 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 su compra...
+ Procesando tu compra...
(Llevará uno o dos minutos).
</floater.string>
@@ -68,10 +68,10 @@ Inténtelo seleccionando un área más pequeña.
no necesita
</floater.string>
<floater.string name="must_upgrade">
- Para poseer terreno, su cuenta debe ascender de categoría.
+ Para poseer terreno, tu cuenta debe ascender de categoría.
</floater.string>
<floater.string name="cant_own_land">
- Su cuenta puede poseer terreno.
+ Tu cuenta puede poseer terreno.
</floater.string>
<floater.string name="land_holdings">
Tienes [BUYER] m² de terreno.
@@ -112,16 +112,16 @@ los suficientes créditos de uso en contribución de terreno
para cubrir esta parcela.
</floater.string>
<floater.string name="have_enough_lindens">
- Tiene [AMOUNT] L$, cantidad suficiente para comprar este terreno.
+ Tienes [AMOUNT] L$, cantidad suficiente para comprar este terreno.
</floater.string>
<floater.string name="not_enough_lindens">
- Sólo tiene [AMOUNT] L$. Necesitaría [AMOUNT2] L$ más.
+ Sólo tienes [AMOUNT] L$. Necesitarías [AMOUNT2] L$ más.
</floater.string>
<floater.string name="balance_left">
- Tras la compra, aún tendrá [AMOUNT] L$.
+ Tras la compra, aún tendrás [AMOUNT] L$.
</floater.string>
<floater.string name="balance_needed">
- Para costearse este terreno, deberá comprar, al menos, [AMOUNT] L$.
+ 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)
@@ -163,7 +163,7 @@ para cubrir esta parcela.
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">
@@ -198,7 +198,7 @@ se vende con 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.
@@ -209,7 +209,7 @@ se vende con los objetos
<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">
Tienes 1309 m² de terreno.
@@ -219,7 +219,7 @@ Esta parcela es de 512 m².
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$
@@ -231,7 +231,7 @@ Esta parcela es de 512 m².
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 las contribuciones de grupo." name="remove_contribution"/>
<button label="Comprar" name="buy_btn"/>
diff --git a/indra/newview/skins/default/xui/es/floater_camera.xml b/indra/newview/skins/default/xui/es/floater_camera.xml
index 40c5603706..787c37e12c 100644
--- a/indra/newview/skins/default/xui/es/floater_camera.xml
+++ b/indra/newview/skins/default/xui/es/floater_camera.xml
@@ -9,6 +9,18 @@
<floater.string name="move_tooltip">
Mover la cámara arriba y abajo, izquierda y derecha
</floater.string>
+ <floater.string name="orbit_mode_title">
+ Orbital
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ Panorámica
+ </floater.string>
+ <floater.string name="avatar_view_mode_title">
+ Posición de tu cámara
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Centrar el objeto
+ </floater.string>
<panel name="controls">
<joystick_track name="cam_track_stick" tool_tip="Mueve la cámara arriba y abajo, a izquierda y derecha"/>
<panel name="zoom" tool_tip="Hacer zoom con la cámara en lo enfocado">
diff --git a/indra/newview/skins/default/xui/es/floater_customize.xml b/indra/newview/skins/default/xui/es/floater_customize.xml
index 4b332cd9c3..77b670d5f0 100644
--- a/indra/newview/skins/default/xui/es/floater_customize.xml
+++ b/indra/newview/skins/default/xui/es/floater_customize.xml
@@ -1,15 +1,15 @@
<?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">
+<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" width="389">
+ <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"/>
@@ -40,12 +40,12 @@
<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 label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <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"/>
@@ -81,7 +81,7 @@
<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 label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <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">
@@ -116,7 +116,7 @@
<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 label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <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">
@@ -147,7 +147,7 @@
<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 label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<text label="Ropa" name="clothes_placeholder">
@@ -159,7 +159,7 @@
<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
<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..." left="199" name="Save As" width="102"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
<text name="title">
[DESC]
@@ -192,7 +192,7 @@
<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
<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..." left="199" name="Save As" width="102"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
<text name="title">
[DESC]
@@ -249,7 +249,7 @@
<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 label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <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">
@@ -282,7 +282,7 @@
<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 label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <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">
@@ -316,7 +316,7 @@
<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 label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <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">
@@ -349,7 +349,7 @@
<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 label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <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">
@@ -382,7 +382,7 @@
<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 label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <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">
@@ -415,7 +415,7 @@
<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 label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <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">
@@ -448,7 +448,7 @@
<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 label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <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">
@@ -522,7 +522,7 @@
<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"/>
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_event.xml b/indra/newview/skins/default/xui/es/floater_event.xml
index 81909e997c..4bc5221796 100644
--- a/indra/newview/skins/default/xui/es/floater_event.xml
+++ b/indra/newview/skins/default/xui/es/floater_event.xml
@@ -9,6 +9,18 @@
<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">
@@ -21,12 +33,21 @@
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>
@@ -36,6 +57,9 @@
<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"/>
diff --git a/indra/newview/skins/default/xui/es/floater_gesture.xml b/indra/newview/skins/default/xui/es/floater_gesture.xml
index 1dc1d54295..d90de8c9f4 100644
--- a/indra/newview/skins/default/xui/es/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/es/floater_gesture.xml
@@ -9,7 +9,7 @@
<floater.string name="copy_name">
Copia de [COPY_NAME]
</floater.string>
- <scroll_list bottom_delta="-385" height="360" name="gesture_list">
+ <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"/>
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 b604f7f46f..218a5effe8 100644
--- a/indra/newview/skins/default/xui/es/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_god_tools.xml
@@ -2,12 +2,11 @@
<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"/>
</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."/>
@@ -47,8 +46,8 @@
<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
diff --git a/indra/newview/skins/default/xui/es/floater_im.xml b/indra/newview/skins/default/xui/es/floater_im.xml
index e6b01a4946..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.
@@ -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_image_preview.xml b/indra/newview/skins/default/xui/es/floater_image_preview.xml
index 0ad91265c9..84c5bfc824 100644
--- a/indra/newview/skins/default/xui/es/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/es/floater_image_preview.xml
@@ -11,16 +11,16 @@
imagen como:
</text>
<combo_box label="Tipo de ropa" left="100" name="clothing_type_combo" width="186">
- <combo_box.item label="Imagen" name="Image"/>
- <combo_box.item label="Pelo" name="Hair"/>
- <combo_box.item label="Mujer: cabeza" name="FemaleHead"/>
- <combo_box.item label="Mujer: parte superior del cuerpo" name="FemaleUpperBody"/>
- <combo_box.item label="Mujer: parte inferior del cuerpo" name="FemaleLowerBody"/>
- <combo_box.item label="Varón: cabeza" name="MaleHead"/>
- <combo_box.item label="Varón: parte superior del cuerpo" name="MaleUpperBody"/>
- <combo_box.item label="Varón: parte inferior del cuerpo" name="MaleLowerBody"/>
- <combo_box.item label="Falda" name="Skirt"/>
- <combo_box.item label="Prim sculpted" name="SculptedPrim"/>
+ <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
index 2b5fc7f193..021e5fb6b7 100644
--- a/indra/newview/skins/default/xui/es/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/es/floater_incoming_call.xml
@@ -22,6 +22,6 @@
¿Quieres dejar [CURRENT_CHAT] y entrar a este chat de voz?
</text>
<button label="Aceptar" label_selected="Aceptar" name="Accept"/>
- <button label="Expulsar" label_selected="Expulsar" name="Reject"/>
+ <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_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 283a46b60b..2c1804bd90 100644
--- a/indra/newview/skins/default/xui/es/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/es/floater_joystick.xml
@@ -16,7 +16,7 @@
Modos de control:
</text>
<check_box label="Avatar" name="JoystickAvatarEnabled"/>
- <check_box label="Construir" left="192" name="JoystickBuildEnabled"/>
+ <check_box label="Construir" name="JoystickBuildEnabled"/>
<check_box label="Flycam" name="JoystickFlycamEnabled"/>
<text name="XScale">
Escala: X
@@ -27,7 +27,7 @@
<text name="ZScale">
Escala: Z
</text>
- <text left="3" name="PitchScale" width="115">
+ <text name="PitchScale">
Escala: arriba/abajo
</text>
<text name="YawScale">
@@ -45,10 +45,10 @@
<text name="ZDeadZone">
Zona muerta Z
</text>
- <text left="3" name="PitchDeadZone" width="115">
+ <text name="PitchDeadZone">
Zona muerta arri./aba.
</text>
- <text left="3" name="YawDeadZone" width="115">
+ <text name="YawDeadZone">
Zona muerta izq./der.
</text>
<text name="RollDeadZone">
@@ -63,7 +63,7 @@
<text name="ZoomDeadZone">
Zona muerta zoom
</text>
- <button font="SansSerifSmall" label="Predeterminados del SpaceNavigator" left="330" name="SpaceNavigatorDefaults" width="210"/>
+ <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">
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 36a02b7300..ed7055b3a1 100644
--- a/indra/newview/skins/default/xui/es/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/es/floater_land_holdings.xml
@@ -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_map.xml b/indra/newview/skins/default/xui/es/floater_map.xml
index fde4d37caf..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" title="Minimapa">
+<floater name="Map" title="">
<floater.string name="mini_map_north">
N
</floater.string>
diff --git a/indra/newview/skins/default/xui/es/floater_moveview.xml b/indra/newview/skins/default/xui/es/floater_moveview.xml
index 1269943879..258f84c361 100644
--- a/indra/newview/skins/default/xui/es/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/es/floater_moveview.xml
@@ -6,23 +6,64 @@
<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)"/>
- <button label="" label_selected="" name="move up btn" tool_tip="Volar: pulsa E para subir"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Volar: pulsa C para descender"/>
+ <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>
@@ -30,6 +71,5 @@
<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"/>
- <button label="Dejar de volar" name="stop_fly_btn" tool_tip="Dejar de volar"/>
</panel>
</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
index e2a53693b5..5fd9dba9ac 100644
--- a/indra/newview/skins/default/xui/es/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/es/floater_outgoing_call.xml
@@ -28,7 +28,7 @@
Has sido desconectado de [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
</text>
<text name="nearby_P2P_by_other">
- [VOICE_CHANNEL_NAME] ha colgado la llamada. [RECONNECT_NEARBY]
+ Tu llamada ha acabado. [RECONNECT_NEARBY]
</text>
<text name="nearby_P2P_by_agent">
Has finalizado la llamada. [RECONNECT_NEARBY]
diff --git a/indra/newview/skins/default/xui/es/floater_preferences.xml b/indra/newview/skins/default/xui/es/floater_preferences.xml
index 37d56ea839..61f12fc0d7 100644
--- a/indra/newview/skins/default/xui/es/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/es/floater_preferences.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater min_width="350" name="Preferences" title="PREFERENCIAS" width="646">
+<floater name="Preferences" title="PREFERENCIAS">
<button label="OK" label_selected="OK" name="OK"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <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"/>
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 57ec5eb7b4..d05a023279 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_notecard.xml
@@ -9,9 +9,6 @@
<floater.string name="Title">
Nota: [NAME]
</floater.string>
- <floater.string label="Guardar" label_selected="Guardar" name="Save">
- Guardar
- </floater.string>
<text name="desc txt">
Descripción:
</text>
@@ -19,4 +16,5 @@
Cargando...
</text_editor>
<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_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_snapshot.xml b/indra/newview/skins/default/xui/es/floater_snapshot.xml
index febb51e5d6..151421c244 100644
--- a/indra/newview/skins/default/xui/es/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/es/floater_snapshot.xml
@@ -1,79 +1,16 @@
<?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 label="Correo-e" name="postcard"/>
- <radio_item label="Mi inventario ([AMOUNT] L$)" name="texture"/>
- <radio_item label="Guardar en mi ordenador" name="local"/>
- </radio_group>
- <text name="file_size_label">
- [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 label="Guardar" name="save_item"/>
- <flyout_button_item label="Guardar como..." name="saveas_item"/>
- </flyout_button>
- <button label="Cancelar" name="discard_btn"/>
- <button label="Más" name="more_btn" tool_tip="Opciones avanzadas"/>
- <button label="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 label="Ventana actual" 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="Personalizar" name="Custom"/>
- </combo_box>
- <combo_box label="Resolución" name="texture_size_combo">
- <combo_box.item label="Ventana actual" name="CurrentWindow"/>
- <combo_box.item label="Pequeño (128x128)" name="Small(128x128)"/>
- <combo_box.item label="Medio (256x256)" name="Medium(256x256)"/>
- <combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
- <combo_box.item label="Personalizar" name="Custom"/>
- </combo_box>
- <combo_box label="Resolución" name="local_size_combo">
- <combo_box.item label="Ventana actual" 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="Personalizar" 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="Ancho" label_width="41" name="snapshot_width" width="101"/>
- <spinner label="Alto" label_width="30" left="121" name="snapshot_height" width="90"/>
- <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 label="Colores" name="Colors"/>
- <combo_box.item label="Profundidad" name="Depth"/>
- <combo_box.item label="Bandas negras" name="ObjectMattes"/>
- </combo_box>
- <check_box label="Interfaz" name="ui_check"/>
- <check_box bottom_delta="-17" label="HUDs" 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 (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"/>
+ <button label="Compartir la foto" name="share"/>
+ <button label="Compartir en la web" name="share_to_web"/>
+ <button label="Guardar en mi inventario" name="save_to_inventory"/>
+ <button label="Guardar la foto" name="save"/>
+ <button label="Foto por correo-e" name="share_to_email"/>
+ <button label="Guardar en mi ordenador" name="save_to_computer"/>
+ <button label="Usar como imagen del perfil" name="set_profile_pic"/>
+ <button label="Atrás" name="cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml
index 1c65567830..9637544f4e 100644
--- a/indra/newview/skins/default/xui/es/floater_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_tools.xml
@@ -1,28 +1,28 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="toolbox floater" short_title="HERRAMIENTAS DE CONSTRUCCIÓN" title="" width="288">
<floater.string name="status_rotate">
- Arrastre las bandas de color para girar el objeto
+ Arrastra las bandas de color para girar el objeto.
</floater.string>
<floater.string name="status_scale">
- Pulse y arrastre para estirar el lado seleccionado
+ Pulsa y arrastra para estirar el lado seleccionado.
</floater.string>
<floater.string name="status_move">
- Arrastrar para mover, Mayús.+arrastrar para copiar
+ Arrastrar para mover, Mayús.+arrastrar para copiar.
</floater.string>
<floater.string name="status_modifyland">
- Mantenga pulsado para modificar el terreno
+ Mantén pulsado para modificar el terreno.
</floater.string>
<floater.string name="status_camera">
- Pulsa y arrastra para mover la cámara
+ Pulsa y arrastra para mover la cámara.
</floater.string>
<floater.string name="status_grab">
- Arrastra para mover: Ctrl, verticalmente; Ctrl-Mayús., girando
+ Arrastrar para mover: Ctrl, verticalmente; Ctrl-Mayús., girando.
</floater.string>
<floater.string name="status_place">
- Pulse en el mundo para construir
+ Pulsa en el mundo para construir.
</floater.string>
<floater.string name="status_selectland">
- Pulse y arrastre para seleccionar el terreno
+ Pulsa y arrastra para seleccionar el terreno.
</floater.string>
<floater.string name="grid_screen_text">
Pantalla
@@ -45,7 +45,7 @@
<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
+ Arrastrar para mover, Mayús.+arrastrar para copiar.
</text>
<radio_group name="focus_radio_group">
<radio_item label="Zoom" name="radio zoom"/>
@@ -67,7 +67,10 @@
<text name="RenderingCost" tool_tip="Muestra cuánto se calcula que cuesta renderizar este objeto">
þ: [COUNT]
</text>
- <check_box label="Estirar ambos lados" name="checkbox uniform"/>
+ <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">
@@ -96,7 +99,7 @@
<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"/>
@@ -123,7 +126,7 @@
<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">
- Transfeir
+ Transferir
</panel.string>
<panel.string name="text deed">
Transferir
@@ -181,7 +184,7 @@
</text>
<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="Transfeir" label_selected="Transfeir" 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."/>
+ <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:
@@ -210,7 +213,7 @@
Cualquiera:
</text>
<check_box label="Moverlo" name="checkbox allow everyone move"/>
- <check_box label="Copiar" name="checkbox allow everyone copy"/>
+ <check_box label="Copiarlo" name="checkbox allow everyone copy"/>
<text name="Next owner can:">
Próximo propietario:
</text>
@@ -355,7 +358,7 @@
</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:
@@ -394,12 +397,11 @@
<text name="glow label">
Resplandor
</text>
- <check_box bottom_delta="-21" label="Brillo al
-máximo" name="checkbox fullbright"/>
+ <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 name="combobox texgen">
<combo_box.item label="Por defecto" name="Default"/>
<combo_box.item label="Plano" name="Planar"/>
</combo_box>
@@ -442,9 +444,9 @@ máximo" name="checkbox fullbright"/>
<check_box label="Voltear" name="checkbox flip s"/>
<spinner label="Vertical (V)" name="TexScaleV"/>
<check_box label="Voltear" name="checkbox flip t"/>
- <spinner label="Rotación" left="118" name="TexRot" width="62"/>
- <spinner label="Repeticiones / Metro" left="118" name="rptctrl" width="62"/>
- <button label="Aplicar" label_selected="Aplicar" left_delta="72" name="button apply"/>
+ <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>
@@ -475,24 +477,17 @@ máximo" name="checkbox fullbright"/>
<text name="label_area">
Ã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:
-
-Verde = Su terreno
-Agua = Terreno de sus grupos
-Rojo = Propiedad de otros
-Amarillo = En venta
-Morado = Para subasta
-Gris = Público"/>
+ <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="Dividir" label_selected="Dividir" name="button subdivide land" width="140"/>
- <button label="Inscribirse" label_selected="Inscribirse" 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>
diff --git a/indra/newview/skins/default/xui/es/floater_tos.xml b/indra/newview/skins/default/xui/es/floater_tos.xml
index cbacce304c..f4a0897d73 100644
--- a/indra/newview/skins/default/xui/es/floater_tos.xml
+++ b/indra/newview/skins/default/xui/es/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="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, lee detenidamente las siguientes Condiciones del Servicio. Para conectarte a [SECOND_LIFE], debes aceptar este 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_water.xml b/indra/newview/skins/default/xui/es/floater_water.xml
index 9996860137..2c1f6cfbfb 100644
--- a/indra/newview/skins/default/xui/es/floater_water.xml
+++ b/indra/newview/skins/default/xui/es/floater_water.xml
@@ -7,7 +7,7 @@
<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>
@@ -55,7 +55,7 @@
</text>
<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>
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_world_map.xml b/indra/newview/skins/default/xui/es/floater_world_map.xml
index a8dc05703c..c3a13980de 100644
--- a/indra/newview/skins/default/xui/es/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/es/floater_world_map.xml
@@ -5,22 +5,37 @@
Leyenda
</text>
</panel>
- <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 propietario
+ por el dueño
</text>
<text name="auction_label">
- subasta de terreno
+ 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 initial_value="verdadero" name="event_mature_chk"/>
<text name="mature_label">
Moderado
</text>
@@ -28,7 +43,28 @@
Adulto
</text>
</panel>
- <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/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
index 12acb572dc..00bdb74881 100644
--- a/indra/newview/skins/default/xui/es/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/es/menu_attachment_other.xml
@@ -10,7 +10,7 @@
<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" name="Debug..."/>
+ <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"/>
diff --git a/indra/newview/skins/default/xui/es/menu_attachment_self.xml b/indra/newview/skins/default/xui/es/menu_attachment_self.xml
index c5afb99d49..afac8d7fe9 100644
--- a/indra/newview/skins/default/xui/es/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/es/menu_attachment_self.xml
@@ -4,9 +4,10 @@
<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="Levantarse" name="Stand Up"/>
- <menu_item_call label="Mi apariencia" name="Appearance..."/>
+ <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_other.xml b/indra/newview/skins/default/xui/es/menu_avatar_other.xml
index 83801e872d..7df2d7c4e0 100644
--- a/indra/newview/skins/default/xui/es/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/es/menu_avatar_other.xml
@@ -10,7 +10,7 @@
<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" name="Debug..."/>
+ <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
index 46b6d3ece6..d347a7d0c4 100644
--- a/indra/newview/skins/default/xui/es/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/es/menu_avatar_self.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Self Pie">
- <menu_item_call label="Levantarse" name="Stand Up"/>
+ <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"/>
@@ -20,8 +20,11 @@
<context_menu label="Desanexar â–¶" name="Object Detach"/>
<menu_item_call label="Quitarse todo" name="Detach All"/>
</context_menu>
- <menu_item_call label="Mi apariencia" name="Appearance..."/>
+ <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
index 8169563882..62683f3076 100644
--- a/indra/newview/skins/default/xui/es/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/es/menu_bottomtray.xml
@@ -4,6 +4,11 @@
<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"/>
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_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
index 34f6b8ece7..236289f82a 100644
--- a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
@@ -11,7 +11,7 @@
<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" name="debug"/>
+ <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"/>
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
index cb8fb82f0d..4b56984541 100644
--- a/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<menu name="Gear Menu">
- <menu_item_call label="Levantarse" name="stand_up"/>
- <menu_item_call label="Mi apariencia" name="my_appearance"/>
+ <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 602798b108..bbee88f600 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"/>
@@ -48,15 +49,19 @@
<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="Borrar carpeta del sistema" name="Delete System Folder"/>
<menu_item_call label="Empezar multiconferencia" name="Conference Chat Folder"/>
diff --git a/indra/newview/skins/default/xui/es/menu_land.xml b/indra/newview/skins/default/xui/es/menu_land.xml
index c315cb2f2c..b0f15be1b6 100644
--- a/indra/newview/skins/default/xui/es/menu_land.xml
+++ b/indra/newview/skins/default/xui/es/menu_land.xml
@@ -1,7 +1,7 @@
<?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="Sentarse aquí" name="Sit Here"/>
+ <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"/>
diff --git a/indra/newview/skins/default/xui/es/menu_login.xml b/indra/newview/skins/default/xui/es/menu_login.xml
index 7ebe2e0c31..5386f82ee5 100644
--- a/indra/newview/skins/default/xui/es/menu_login.xml
+++ b/indra/newview/skins/default/xui/es/menu_login.xml
@@ -2,23 +2,14 @@
<menu_bar name="Login Menu">
<menu label="Yo" name="File">
<menu_item_call label="Preferencias" name="Preferences..."/>
- <menu_item_call label="Salir" name="Quit"/>
+ <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>
+ <menu_item_check label="Mostrar el menú &apos;Debug&apos;" name="Show Debug Menu"/>
<menu label="Depurar" name="Debug">
- <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>
<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"/>
@@ -26,5 +17,7 @@
<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 9c5a5719ee..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,5 +1,5 @@
<?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"/>
diff --git a/indra/newview/skins/default/xui/es/menu_object.xml b/indra/newview/skins/default/xui/es/menu_object.xml
index 18b6363bbb..d2743cd4fc 100644
--- a/indra/newview/skins/default/xui/es/menu_object.xml
+++ b/indra/newview/skins/default/xui/es/menu_object.xml
@@ -4,11 +4,12 @@
<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="Sentarse aquí" name="Object Sit"/>
+ <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="Ponerse" name="Wear"/>
+ <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>
diff --git a/indra/newview/skins/default/xui/es/menu_participant_list.xml b/indra/newview/skins/default/xui/es/menu_participant_list.xml
index 60c92eec75..fd8bd05230 100644
--- a/indra/newview/skins/default/xui/es/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/es/menu_participant_list.xml
@@ -5,16 +5,17 @@
<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="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="Silenciar a todos los demás" name="ModerateVoiceMuteOthers"/>
<menu_item_call label="Quitar el silencio a este participante" name="ModerateVoiceUnMuteSelected"/>
- <menu_item_call label="Quitar el silencio a todos los demás" name="ModerateVoiceUnMuteOthers"/>
+ <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_nearby.xml b/indra/newview/skins/default/xui/es/menu_people_nearby.xml
index 88df983838..dc1486d879 100644
--- a/indra/newview/skins/default/xui/es/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/es/menu_people_nearby.xml
@@ -4,7 +4,7 @@
<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="Llamada" name="Call"/>
+ <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"/>
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
index b87d6c6deb..4ab6000994 100644
--- a/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml
+++ b/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml
@@ -3,7 +3,7 @@
<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="Llamada" name="Call"/>
+ <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_profile_overflow.xml b/indra/newview/skins/default/xui/es/menu_profile_overflow.xml
index 37ad29d8ec..5ee8c50949 100644
--- a/indra/newview/skins/default/xui/es/menu_profile_overflow.xml
+++ b/indra/newview/skins/default/xui/es/menu_profile_overflow.xml
@@ -1,5 +1,6 @@
<?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"/>
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..f21dd32b80
--- /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 nuevo" 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_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index 9c08fbb2c8..1bc3e981ce 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -7,11 +7,11 @@
</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="Mi apariencia" name="Appearance"/>
+ <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 label="Mi estatus" name="Status">
+ <menu label="Mi estado" name="Status">
<menu_item_call label="Ausente" name="Set Away"/>
<menu_item_call label="Ocupado" name="Set Busy"/>
</menu>
@@ -19,7 +19,7 @@
<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="Comunicarse" name="Communicate">
+ <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"/>
@@ -31,6 +31,7 @@
<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>
@@ -66,17 +67,6 @@
<menu_item_call label="Herramienta Crear" name="Create"/>
<menu_item_call label="Herramienta Terreno" name="Land"/>
</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="Eliminar" 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>
<menu_item_call label="Enlazar" name="Link"/>
<menu_item_call label="Desenlazar" name="Unlink"/>
<menu_item_check label="Editar las partes enlazadas" name="Edit Linked Parts"/>
@@ -121,8 +111,10 @@
<menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/>
<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"/>
@@ -144,7 +136,6 @@
<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_item_check label="Mostrar información complementaria del terreno" name="Land Tips"/>
</menu>
<menu label="Objetos representados" name="Rendering Types">
<menu_item_check label="Simple" name="Simple"/>
@@ -171,6 +162,7 @@
<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">
@@ -197,10 +189,9 @@
<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_item_call label="Pantalla completa" name="Toggle Fullscreen"/>
</menu>
<menu_item_call label="Mostrar las configuraciones del depurador" name="Debug Settings"/>
- <menu_item_check label="Mostrar el menú Desarrollar" name="Debug Mode"/>
+ <menu_item_check label="Mostrar el menú &apos;Develop&apos;" name="Debug Mode"/>
</menu>
<menu label="Develop" name="Develop">
<menu label="Consoles" name="Consoles">
@@ -238,7 +229,7 @@
<menu_item_check label="Frame Test" name="Frame Test"/>
</menu>
<menu label="Rendering" name="Rendering">
- <menu_item_check label="Ejes" name="Axes"/>
+ <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"/>
@@ -254,7 +245,7 @@
<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="Baliza con destellos" name="Cheesy Beacon"/>
+ <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>
@@ -277,10 +268,10 @@
<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="Cabeza" name="Head"/>
+ <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="Falda" name="Skirt"/>
+ <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"/>
@@ -297,8 +288,8 @@
<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="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="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">
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index f99bb277cb..47dc31f5f4 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -74,7 +74,7 @@ Detalles del error: la notificación de nombre &apos;[_NAME]&apos; no se ha enco
<notification name="LoginFailedNoNetwork">
No se puede conectar con [SECOND_LIFE_GRID].
&apos;[DIAGNOSTIC]&apos;
-Asegúrate de que tu conexión a internet está funcionando adecuadamente.
+Asegúrate de que tu conexión a Internet está funcionando adecuadamente.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MessageTemplateNotFound">
@@ -86,19 +86,19 @@ Asegúrate de que tu conexión a internet está funcionando adecuadamente.
<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?
@@ -106,7 +106,7 @@ Asegúrate de que tu conexión a internet está funcionando adecuadamente.
</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="Sí"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="GrantModifyRights">
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.
@@ -119,11 +119,11 @@ Asegúrate de que tu conexión a internet está funcionando adecuadamente.
<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">
@@ -137,25 +137,25 @@ Asegúrate de que tu conexión a internet está funcionando adecuadamente.
<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?
+ 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.
@@ -169,7 +169,7 @@ No podrá removérseles de ese rol, sino que deberán renunciar a él por sí mi
</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">
@@ -179,7 +179,7 @@ No podrá removérseles de ese rol, sino que deberán renunciar a él por sí mi
</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$.
@@ -188,16 +188,16 @@ 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">
@@ -208,7 +208,7 @@ 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!
@@ -216,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!
@@ -237,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!
@@ -246,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">
@@ -272,13 +272,13 @@ Para colocar los media en una sola cara, marca la opción Elegir la cara y pulsa
</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?
@@ -297,32 +297,35 @@ 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; 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.
@@ -349,7 +352,7 @@ No se reembolsan las cuotas pagadas.
<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">
@@ -360,10 +363,10 @@ 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.
+ Por favor, selecciona un ítem del historial para verlo.
</notification>
<notification name="CacheWillClear">
La caché se limpiará cuando reinices [APP_NAME].
@@ -376,7 +379,7 @@ Nota: esto vaciará la caché.
La configuración del puerto tendrá efecto cuando reinicies [APP_NAME].
</notification>
<notification name="ChangeSkin">
- La nueva apariencia la verás cuando reinicies [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
@@ -390,43 +393,43 @@ 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">
- Perdon, no está definida tu Posición inicial.
+ 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>
@@ -443,7 +446,6 @@ El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&
<notification name="UnsupportedHardware">
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
¿Ir a [_URL] para más información?
<url name="url" option="0">
http://secondlife.com/support/sysreqs.php?lang=es
@@ -468,9 +470,9 @@ La calidad gráfica puede ajustarse en Preferencias &gt; Gráficos.
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 este ítem.
+Si lo das, lo perderás de tu inventario.
+¿Realmente quieres darlo?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="CannotGiveItem">
@@ -480,19 +482,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">
@@ -506,15 +508,15 @@ 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">
@@ -525,7 +527,7 @@ Temporalmente, será incapaz de moverse, usar el chat, o interactuar con el mund
</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">
@@ -539,27 +541,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]
@@ -567,7 +569,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">
@@ -612,6 +614,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>
@@ -626,7 +633,7 @@ Podría ser [VALIDS]
</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].
@@ -636,26 +643,26 @@ Por favor, inténtelo más tarde.
<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.
@@ -663,24 +670,24 @@ Seleccione objetos con scripts en los que usted tenga permiso para modificarlos.
<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">
@@ -696,32 +703,32 @@ Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
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. 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.
</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.
+Vuelve a intentarlo en un momento.
</notification>
<notification 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.
</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.
+ 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 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.
</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.
+ 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 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 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.
+ 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.
@@ -731,7 +738,7 @@ Vuelva a intentarlo en un momento.
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">
Esta parcela está subastándose. Forzar su propiedad cancelará la subasta y, potencialmente, puede disgustar a algunos residentes si la puja ya ha empezado.
@@ -771,7 +778,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:
@@ -779,15 +786,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.
+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:
@@ -797,18 +804,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:
@@ -820,13 +827,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"/>
@@ -834,13 +841,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.
@@ -862,29 +869,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="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">
@@ -897,31 +904,31 @@ Deberá reconfigurar el nombre y las opciones de la nueva parcela.
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.
Generalmente, esto es un fallo pasajero. Por favor, personaliza y guarda el ítem de aquí a unos minutos.
</notification>
<notification name="YouHaveBeenLoggedOut">
- Vaya, se te ha cerrado la sesión en [SECOND_LIFE]
+ Vaya, se ha cerrado tu sesión en [SECOND_LIFE].
[MESSAGE]
<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?
@@ -930,113 +937,129 @@ 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 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.
@@ -1057,10 +1080,10 @@ 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]
@@ -1094,9 +1117,9 @@ Si es la primera vez que usas [SECOND_LIFE], debes crear una cuenta antes de pod
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Cuenta nueva..."/>
</notification>
<notification name="LoginPacketNeverReceived">
- Tenemos problemas de conexión. Puede deberse a un problema de tu conexión a internet o de [SECOND_LIFE_GRID].
+ Tenemos problemas de conexión. Puede deberse a un problema de tu conexión a Internet o de [SECOND_LIFE_GRID].
-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.
+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>
@@ -1107,16 +1130,52 @@ Puedes revisar tu conexión a internet y volver a intentarlo en unos minutos, pu
</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">
[NAME] te ha dado permiso para modificar sus objetos.
@@ -1125,25 +1184,25 @@ Puede cambiar más adelante su elección.
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>
@@ -1151,50 +1210,50 @@ 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:
@@ -1274,15 +1333,15 @@ Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar
<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.
+ 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].
+ 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.
+ 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">
@@ -1298,26 +1357,26 @@ Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar
<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="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">
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="Falló ignorar el objeto según su nombre." name="MuteByNameFailed">
Ya has ignorado este nombre.
@@ -1325,20 +1384,20 @@ Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar
</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 (é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.
+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">
@@ -1351,10 +1410,10 @@ Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respue
<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"/>
@@ -1364,34 +1423,34 @@ Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respue
¿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]
@@ -1401,7 +1460,7 @@ Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respue
</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]
@@ -1419,11 +1478,15 @@ Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respue
<usetemplate ignoretext="Confirmar el teleporte a una localización de los Destacados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
</notification>
<notification name="TeleportToClassified">
- ¿Teleportarse a [CLASSIFIED]?
+ ¿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"/>
@@ -1431,15 +1494,15 @@ Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respue
</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.
@@ -1482,54 +1545,57 @@ 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.
+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 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">
No estás autorizado en esta región por tus preferencias sobre el 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.
+Pulsa &apos;Cambiar las preferencias&apos; para incrementar las preferencias del nivel de calificación y obtener acceso inmediato. Esto te permitirá buscar contenidos [REGIONMATURITY] y tener acceso a ellos. Si prefieres cambiar esta opción más adelante, puedes hacerlo desde 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.
+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 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 puedes reclamar este terreno por tus preferencias sobre el nivel de calificación.
@@ -1538,22 +1604,22 @@ Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferen
<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.
+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 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 puedes comprar este terreno por tus preferencias sobre el nivel de calificación.
@@ -1573,7 +1639,7 @@ Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferen
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.
@@ -1588,25 +1654,25 @@ Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferen
<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;?
+ ¿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;?
+ ¿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"/>
@@ -1624,20 +1690,20 @@ Para entrar a regiones Adultas, los Residentes deben haber verificado su cuenta,
</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]
@@ -1645,8 +1711,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]
@@ -1654,8 +1720,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]
@@ -1663,8 +1729,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]
@@ -1672,27 +1738,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"/>
@@ -1701,18 +1767,18 @@ 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="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="Avisarme antes de que mueva ítems &apos;no copiables&apos; que puedan estropear un objeto con script" name="okcancelignore" notext="Cancelar" yestext="OK"/>
@@ -1724,7 +1790,7 @@ Dado que estos objetos tienen scripts, moverlos a su inventario puede provocar u
</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 a tu [http://secondlife.com/account/ Panel de Control] para ver el historial de tu cuenta?
@@ -1735,29 +1801,29 @@ Dado que estos objetos tienen scripts, moverlos a su inventario puede provocar u
<usetemplate ignoretext="Confirmar antes de salir" name="okcancelignore" notext="No salir" yestext="Salir"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Usa esta herramienta para denunciar violaciones de las [http://secondlife.com/corporate/tos.php Condiciones de Servicio] o las [http://secondlife.com/corporate/cs.php 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.
</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">
@@ -1780,7 +1846,7 @@ 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="Reemplazar un añadido actual con el ítem seleccionado"/>
<button ignore="Reemplazar automaticamente" name="Yes" text="OK"/>
@@ -1788,9 +1854,9 @@ Linden Lab
</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="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"/>
@@ -1798,7 +1864,7 @@ Linden Lab
</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?
+ 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">
@@ -1810,11 +1876,11 @@ Linden Lab
<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">
@@ -1831,21 +1897,21 @@ Publícala en una página web para que otros puedan acceder fácilmente a esta p
</form>
</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="NewSkyPreset">
@@ -1875,7 +1941,7 @@ Publícala en una página web para que otros puedan acceder fácilmente a esta p
¡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].
@@ -1888,7 +1954,7 @@ Publícala en una página web para que otros puedan acceder fácilmente a esta p
<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>
@@ -1896,7 +1962,7 @@ Publícala en una página web para que otros puedan acceder fácilmente a esta p
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">
@@ -1927,14 +1993,17 @@ Publícala en una página web para que otros puedan acceder fácilmente a esta p
<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.
@@ -1955,8 +2024,13 @@ Publícala en una página web para que otros puedan acceder fácilmente a esta p
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.
@@ -1977,7 +2051,7 @@ Publícala en una página web para que otros puedan acceder fácilmente a esta p
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">
Tienes pulsada la tecla de mayúsculas.
@@ -1990,7 +2064,7 @@ Esto puede influir en tu contraseña.
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.
@@ -1999,30 +2073,30 @@ Esto puede influir en tu contraseña.
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 puedes comprar más de un objeto a la vez.
@@ -2044,16 +2118,16 @@ Por favor, selecciona un sólo objeto.
[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">
Puedes teleportarte a lugares como &apos;[NAME]&apos; abriendo el panel Lugares -a la derecha de tu pantalla- y seleccionando la sección Hitos.
@@ -2066,14 +2140,14 @@ Elige al Residente de la lista y pulsa &apos;MI&apos; en la parte inferior del p
(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:
@@ -2129,10 +2203,10 @@ Por favor, reinstala el plugin o contacta con el vendedor si sigues teniendo pro
</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 seleccionados en la parcela de terreno propiedad de &apos;[NAME]&apos;.
@@ -2143,7 +2217,7 @@ 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]:
@@ -2181,33 +2255,33 @@ Los scripts no funcionan aquí, excepto los pertenecientes al propietario del te
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.
+ 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.
+ 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.
@@ -2216,17 +2290,17 @@ Por favor, vaya a la Base de Conocimientos para más detalles sobre el acceso a
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.
@@ -2241,13 +2315,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.
@@ -2264,15 +2338,6 @@ Por favor, reinténtelo en unos momentos.
<button name="Mute" text="Ignorar"/>
</form>
</notification>
- <notification name="ObjectGiveItemUnknownUser">
- Un objeto de nombre [OBJECTFROMNAME] propiedad de (un Residente desconocido) te ha dado este [OBJECTTYPE]:
-[ITEM_SLURL]
- <form name="form">
- <button name="Keep" text="Guardar"/>
- <button name="Discard" text="Descartar"/>
- <button name="Mute" text="Ignorar"/>
- </form>
- </notification>
<notification name="UserGiveItem">
[NAME_SLURL] te ha dado este [OBJECTTYPE]:
[ITEM_SLURL]
@@ -2296,9 +2361,9 @@ Por favor, reinténtelo en unos momentos.
</form>
</notification>
<notification name="TeleportOffered">
- [NAME] te ofrece teleportarte a su localizació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"/>
@@ -2316,11 +2381,11 @@ 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"/>
@@ -2330,19 +2395,19 @@ Por favor, reinténtelo en unos momentos.
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.
@@ -2363,7 +2428,7 @@ Esto añadirá un marcador en tu inventario para que puedas enviarle rápidament
Si permaneces en esta región serás desconectado.
</notification>
<notification name="RegionRestartSeconds">
- Esta región se reiniciará en [SECONDS] segundos.
+ Esta región se reiniciará en [SECONDS] segundos.
Si permaneces en esta región serás desconectado.
</notification>
<notification name="LoadWebPage">
@@ -2383,6 +2448,9 @@ 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 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>
@@ -2390,7 +2458,7 @@ Del objeto: [OBJECTNAME]; propiedad de: [NAME]?
&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"/>
@@ -2424,25 +2492,17 @@ Si no confias en este objeto y en su creador, deberías rehusar esta petición.
<button name="Ignore" text="Ignorar"/>
</form>
</notification>
- <notification name="ScriptToast">
- El &apos;[TITLE]&apos; de [FIRST] [LAST] está esperando una respuesta del usuario.
- <form name="form">
- <button name="Open" text="Abrir el diálogo"/>
- <button name="Ignore" text="Ignorar"/>
- <button name="Block" text="Ignorar"/>
- </form>
- </notification>
<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$.
+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.
+ 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) donde los Residentes pueden aprender a construir.
@@ -2450,7 +2510,7 @@ Algunos objetos (las pistolas, por ejemplo) le pedirán que, para usarlos, entre
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] te está invitando a un chat de voz.
@@ -2498,10 +2558,10 @@ Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar a
</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">
Has sido desconectado de [VOICE_CHANNEL_NAME]. Vas a ser reconectado al chat de voz.
@@ -2519,22 +2579,22 @@ Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar a
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="Cannot enter parcel: not a group member">
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">
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].
@@ -2557,7 +2617,7 @@ Por tu seguridad, serán bloqueadas durante unos segundos.
</notification>
<notification name="ConfirmCloseAll">
¿Seguro que quieres cerrar todos los MI?
- <usetemplate name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <usetemplate ignoretext="Confirmar antes de cerrar todos los MIs" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="AttachmentSaved">
Se ha guardado el adjunto.
@@ -2584,10 +2644,59 @@ Por tu seguridad, serán bloqueadas durante unos segundos.
</notification>
<notification name="BottomTrayButtonCanNotBeShown">
El botón elegido no se puede mostrar correctamente.
-Se mostrará cuando tenga suficiente espacio.
+Se mostrará cuando haya suficiente espacio.
+ </notification>
+ <notification name="ShareNotification">
+ Arrastrar ítems desde el inventario hasta una persona en el perfil del residente.
+ </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="AvatarRezSelfNotification">
+ ( [EXISTENCE] segundos vivo)
+Has terminado de texturizar tu vestuario en [TIME] segundos.
+ </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="AvatarRezLeftNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; ya estaba totalmente cargado al salir.
+ </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="OK" yestext="Cancelar"/>
</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 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.
@@ -2601,10 +2710,10 @@ Si los problemas persisten, por favor, acude a [SUPPORT_SITE].
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.
+ - La memoria de tu sistema no cumple los requerimientos mínimos.
</global>
<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.
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_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
index 74dc17f3de..5ea09ed795 100644
--- a/indra/newview/skins/default/xui/es/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/es/panel_bottomtray.xml
@@ -1,11 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="bottom_tray">
- <string name="SpeakBtnToolTip">
- Activa/Desactiva el micrófono
- </string>
- <string name="VoiceControlBtnToolTip">
- Muestra/Oculta el panel del control de voz
- </string>
+ <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">
@@ -24,6 +20,21 @@
<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"/>
diff --git a/indra/newview/skins/default/xui/es/panel_classified_info.xml b/indra/newview/skins/default/xui/es/panel_classified_info.xml
index d46eadde48..35fe174970 100644
--- a/indra/newview/skins/default/xui/es/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/es/panel_classified_info.xml
@@ -3,16 +3,46 @@
<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="[nombre]"/>
- <text_editor name="classified_location" value="[cargando...]"/>
- <text_editor name="content_type" value="[tipo de contenido]"/>
- <text_editor name="category" value="[categoría]"/>
- <check_box label="Renovar automáticamente cada semana" name="auto_renew"/>
- <text_editor name="price_for_listing" tool_tip="Precio por publicarlo."/>
- <text_editor name="classified_desc" value="[descripción]"/>
+ <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">
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_classified.xml b/indra/newview/skins/default/xui/es/panel_edit_classified.xml
index e612104b3f..6d53b401c0 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_classified.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_classified.xml
@@ -3,12 +3,20 @@
<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">
- <icon label="" name="edit_icon" tool_tip="Pulsa para elegir una imagen"/>
+ <panel name="snapshot_panel">
+ <icon label="" name="edit_icon" tool_tip="Pulsa para elegir una imagen"/>
+ </panel>
<text name="Name:">
Título:
</text>
@@ -21,13 +29,20 @@
<text name="classified_location">
cargando...
</text>
- <button label="Configurarlo en esta localización" name="set_to_curr_location_btn"/>
+ <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="Guardar" name="save_changes_btn"/>
+ <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
index e33848554d..29a416f698 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_eyes.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_eyes.xml
@@ -3,7 +3,9 @@
<panel name="avatar_eye_color_panel">
<texture_picker label="Iris" name="Iris" tool_tip="Pulsa para elegir una imagen"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="eyes_main_tab" title="Ojos"/>
- </accordion>
+ <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
index 397322466c..684a35a830 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_gloves.xml
@@ -4,7 +4,9 @@
<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>
- <accordion name="wearable_accordion">
- <accordion_tab name="gloves_main_tab" title="Guantes"/>
- </accordion>
+ <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
index 49cc8ce98c..25af1ea8cb 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_hair.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_hair.xml
@@ -3,10 +3,12 @@
<panel name="avatar_hair_color_panel">
<texture_picker label="Textura" name="Texture" tool_tip="Pulsa para elegir una imagen"/>
</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 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
index abee993aec..347107d746 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_jacket.xml
@@ -5,7 +5,9 @@
<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>
- <accordion name="wearable_accordion">
- <accordion_tab name="jacket_main_tab" title="Chaqueta"/>
- </accordion>
+ <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
index 80eb5f0de0..e765702343 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_pants.xml
@@ -4,7 +4,9 @@
<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>
- <accordion name="wearable_accordion">
- <accordion_tab name="pants_main_tab" title="Pantalones"/>
- </accordion>
+ <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
index 839e9c6023..f8a03d2302 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_pick.xml
@@ -1,5 +1,8 @@
<?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>
@@ -18,11 +21,11 @@
<text name="pick_location">
cargando...
</text>
- <button label="Configurar en la posición actual" name="set_to_curr_location_btn"/>
+ <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 [WHAT]" name="save_changes_btn"/>
+ <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_shape.xml b/indra/newview/skins/default/xui/es/panel_edit_shape.xml
index 8a9ac0e9ec..e64ec9ab7c 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_shape.xml
+++ b/indra/newview/skins/default/xui/es/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">
- Sexo:
- </text>
- <radio_group name="sex_radio">
- <radio_item label="Mujer" name="radio"/>
- <radio_item label="Varón" name="radio2"/>
- </radio_group>
+ <text name="avatar_height">
+ [HEIGHT] metros de alto
+ </text>
+ <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>
- <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>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_shirt.xml b/indra/newview/skins/default/xui/es/panel_edit_shirt.xml
index 6d65660409..f763e1b18d 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_shirt.xml
@@ -4,7 +4,9 @@
<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>
- <accordion name="wearable_accordion">
- <accordion_tab name="shirt_main_tab" title="Camisa"/>
- </accordion>
+ <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
index e613b1809d..70f2027398 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_shoes.xml
@@ -4,7 +4,9 @@
<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>
- <accordion name="wearable_accordion">
- <accordion_tab name="shoes_main_tab" title="Zapatos"/>
- </accordion>
+ <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
index 2d9e556a4a..501ecfb4de 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_skin.xml
@@ -5,10 +5,12 @@
<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>
- <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 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
index c8e25d38a9..2c7196642c 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_skirt.xml
@@ -4,7 +4,9 @@
<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>
- <accordion name="wearable_accordion">
- <accordion_tab name="skirt_main_tab" title="Falda"/>
- </accordion>
+ <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
index d65f119da7..28423eaf61 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_socks.xml
@@ -4,7 +4,9 @@
<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>
- <accordion name="wearable_accordion">
- <accordion_tab name="socks_main_tab" title="Calcetines"/>
- </accordion>
+ <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
index e5e72a11e4..8776dd6c10 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_tattoo.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_tattoo.xml
@@ -4,5 +4,6 @@
<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
index ea446c1625..6c82bcfedf 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_underpants.xml
@@ -4,7 +4,9 @@
<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>
- <accordion name="wearable_accordion">
- <accordion_tab name="underpants_main_tab" title="Ropa interior"/>
- </accordion>
+ <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
index 92e42657a4..412bdceddf 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml
@@ -4,7 +4,9 @@
<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>
- <accordion name="wearable_accordion">
- <accordion_tab name="undershirt_main_tab" title="Camiseta"/>
- </accordion>
+ <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
index 6d48b77d3c..8bafe0f29a 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_wearable.xml
@@ -93,6 +93,17 @@
<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 label="gear_buttom_panel" name="gear_buttom_panel">
+ <button name="friends_viewsort_btn" tool_tip="Opciones"/>
+ <button name="add_btn" tool_tip="TODO"/>
+ <button name="del_btn" tool_tip="TODO"/>
</panel>
<panel name="button_panel">
<button label="Guardar como" name="save_as_button"/>
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 66d0c5be93..c4f17ab6dc 100644
--- a/indra/newview/skins/default/xui/es/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_general.xml
@@ -47,8 +47,11 @@ Deja el cursor sobre las opciones para ver más ayuda.
<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_box.item label="Contenido &apos;PG&apos;" name="pg"/>
+ <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>
<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>
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 b763e2e74d..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
@@ -6,6 +6,9 @@
<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>
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 58e1919782..7a3dbad59e 100644
--- a/indra/newview/skins/default/xui/es/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_notices.xml
@@ -36,6 +36,7 @@ El máximo es de 200 por día y grupo.
<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"/>
<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."/>
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
index c3d5b017ad..7d4db6a630 100644
--- a/indra/newview/skins/default/xui/es/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/es/panel_im_control_panel.xml
@@ -13,7 +13,7 @@
<layout_panel name="share_btn_panel">
<button label="Compartir" name="share_btn"/>
</layout_panel>
- <layout_panel name="share_btn_panel">
+ <layout_panel name="pay_btn_panel">
<button label="Pagar" name="pay_btn"/>
</layout_panel>
<layout_panel name="call_btn_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_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml
index c5494d8199..4b45a6f7b8 100644
--- a/indra/newview/skins/default/xui/es/panel_login.xml
+++ b/indra/newview/skins/default/xui/es/panel_login.xml
@@ -8,24 +8,30 @@
</panel.string>
<layout_stack name="login_widgets">
<layout_panel name="login">
- <text name="first_name_text">
- Nombre:
+ <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>
- <line_editor label="Nombre" name="first_name_edit" tool_tip="[SECOND_LIFE] First Name"/>
- <line_editor label="Apellido" name="last_name_edit" tool_tip="[SECOND_LIFE] Last Name"/>
<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>
- <button label="Iniciar sesión" name="connect_btn"/>
</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>
diff --git a/indra/newview/skins/default/xui/es/panel_main_inventory.xml b/indra/newview/skins/default/xui/es/panel_main_inventory.xml
index 8656098467..7e318a150b 100644
--- a/indra/newview/skins/default/xui/es/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/es/panel_main_inventory.xml
@@ -1,64 +1,28 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Cosas" name="main inventory panel">
- <panel.string name="Title">
- Cosas
+ <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"/>
- <inventory_panel label="Ãtems recientes" name="Recent Items"/>
+ <recent_inventory_panel label="Ãtems recientes" name="Recent Items"/>
</tab_container>
- <panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Mostrar más opciones"/>
- <button name="add_btn" tool_tip="Añadir un ítem nuevo"/>
- <dnd_button name="trash_btn" tool_tip="Quitar el ítem seleccionado"/>
- </panel>
- <menu_bar name="Inventory Menu">
- <menu label="Archivo" name="File">
- <menu_item_call label="Abrir" name="Open"/>
- <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="Ventana nueva" 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_item_call label="Vaciar Objetos Perdidos" name="Empty Lost And Found"/>
- </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 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>
- <menu label="Ordenar" name="Sort">
- <menu_item_check label="Alfabéticamente" name="By Name"/>
- <menu_item_check label="Cronológicamente" name="By Date"/>
- <menu_item_check label="Las carpetas siempre alfabéticamente" name="Folders Always By Name"/>
- <menu_item_check label="Las carpetas del sistema, arriba" 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="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_media_settings_permissions.xml b/indra/newview/skins/default/xui/es/panel_media_settings_permissions.xml
index 3e625f56fe..ec9edbfa15 100644
--- a/indra/newview/skins/default/xui/es/panel_media_settings_permissions.xml
+++ b/indra/newview/skins/default/xui/es/panel_media_settings_permissions.xml
@@ -11,10 +11,19 @@
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_nearby_media.xml b/indra/newview/skins/default/xui/es/panel_nearby_media.xml
index 885c780e00..d1a14c877f 100644
--- a/indra/newview/skins/default/xui/es/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/es/panel_nearby_media.xml
@@ -1,5 +1,8 @@
<?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>
@@ -16,13 +19,15 @@
<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_less_btn" tool_tip="Controles avanzados"/>
+ <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"/>
@@ -37,16 +42,16 @@
<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 seleccionados"/>
+ <button name="play_btn" tool_tip="Ejecutar los media"/>
</layout_panel>
<layout_panel name="pause">
- <button name="pause_btn" tool_tip="Pausar los media seleccionados"/>
+ <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="Silenciar el audio de los media seleccionados"/>
+ <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"/>
diff --git a/indra/newview/skins/default/xui/es/panel_notes.xml b/indra/newview/skins/default/xui/es/panel_notes.xml
index bf8da4cf73..8de2afa767 100644
--- a/indra/newview/skins/default/xui/es/panel_notes.xml
+++ b/indra/newview/skins/default/xui/es/panel_notes.xml
@@ -15,7 +15,7 @@
<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="Llamada" name="call" tool_tip="Llamar a este Residente"/>
+ <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>
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..b7c0e840b2
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_outfit_edit.xml
@@ -0,0 +1,45 @@
+<?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"/>
+ <button label="editar" name="edit_wearable_btn"/>
+ <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">
+ <panel label="bottom_panel" name="edit_panel"/>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel">
+ <text name="add_to_outfit_label" value="Añadir a vestuario:"/>
+ <layout_stack name="filter_panels">
+ <layout_panel label="Panel de control de MI" name="filter_panel">
+ <filter_editor label="Filtrar" name="look_item_filter"/>
+ </layout_panel>
+ </layout_stack>
+ <panel label="add_wearables_button_bar" name="add_wearables_button_bar">
+ <button label="C" name="folder_view_btn"/>
+ <button label="L" name="list_view_btn"/>
+ </panel>
+ </layout_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
index 2f60df7743..4b23094103 100644
--- a/indra/newview/skins/default/xui/es/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/es/panel_outfits_inventory.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Cosas" name="Outfits">
<tab_container name="appearance_tabs">
- <inventory_panel label="MIS VESTUARIOS" name="outfitslist_tab"/>
+ <panel label="MIS VESTUARIOS" name="outfitslist_tab"/>
<inventory_panel label="PUESTO" name="cof_tab"/>
</tab_container>
<panel name="bottom_panel">
@@ -9,6 +9,6 @@
<dnd_button name="trash_btn" tool_tip="Quitar el ítem seleccionado"/>
<button label="Guardar el vestuario" name="make_outfit_btn" tool_tip="Guardar la apariencia como un vestuario"/>
<button label="Ponerme" name="wear_btn" tool_tip="Ponerme el vestuario seleccionado"/>
- <button label="M" name="look_edit_btn"/>
+ <button label="Editar el vestuario" name="edit_current_outfit_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml
index 03c449da93..13f584ff28 100644
--- a/indra/newview/skins/default/xui/es/panel_people.xml
+++ b/indra/newview/skins/default/xui/es/panel_people.xml
@@ -1,15 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Side tray panel -->
<panel label="Gente" name="people_panel">
- <string name="no_people" value="No hay nadie"/>
- <string name="no_one_near" value="No hay nadie cerca"/>
+ <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="CERCANÃA" name="nearby_panel">
+ <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"/>
@@ -18,17 +29,13 @@
<panel label="MIS AMIGOS" name="friends_panel">
<accordion name="friends_accordion">
<accordion_tab name="tab_online" title="Conectado"/>
- <accordion_tab name="tab_all" title="Todas"/>
+ <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>
- <text name="no_friends_msg">
- Para añadir amigos, prueba a hacer una [secondlife:///app/search/people búsqueda general] o pulsa en un usuario para añadirle como amigo.
-Si estás buscando gente para pasar el rato, [secondlife:///app/worldmap usa el mapa].
- </text>
</panel>
<panel label="MIS GRUPOS" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
@@ -47,9 +54,9 @@ Si estás buscando gente para pasar el rato, [secondlife:///app/worldmap usa el
<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="Llamada" name="call_btn" tool_tip="Llamar a este Residente"/>
- <button label="Compartir" name="share_btn"/>
- <button label="Teleportarse" name="teleport_btn" tool_tip="Ofrecer teleporte"/>
+ <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"/>
diff --git a/indra/newview/skins/default/xui/es/panel_place_profile.xml b/indra/newview/skins/default/xui/es/panel_place_profile.xml
index 2c873ef464..6fe7895d45 100644
--- a/indra/newview/skins/default/xui/es/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/es/panel_place_profile.xml
@@ -70,10 +70,17 @@
<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>
diff --git a/indra/newview/skins/default/xui/es/panel_places.xml b/indra/newview/skins/default/xui/es/panel_places.xml
index 4818bff069..1970284466 100644
--- a/indra/newview/skins/default/xui/es/panel_places.xml
+++ b/indra/newview/skins/default/xui/es/panel_places.xml
@@ -11,5 +11,6 @@
<button label="Guardar" name="save_btn"/>
<button label="Cancelar" name="cancel_btn"/>
<button label="Cerrar" name="close_btn"/>
+ <button label="Perfil" name="profile_btn"/>
</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 add854932d..c3a23c74c4 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
@@ -3,6 +3,9 @@
<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">
@@ -10,13 +13,17 @@
</text>
<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="1" 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="Bocadillos del chat" name="bubble_text_chat"/>
+ <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"/>
@@ -26,4 +33,5 @@
<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 0ccc307039..f34edf149e 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_alerts.xml
@@ -4,7 +4,7 @@
Avisarme:
</text>
<check_box label="Cuando gaste o consiga L$" name="notify_money_change_checkbox"/>
- <check_box label="Cuando mis amigos se conectan o desconectan" name="friends_online_notify_checkbox"/>
+ <check_box label="Cuando mis amigos se conecten o desconecten" name="friends_online_notify_checkbox"/>
<text name="show_label" width="300">
Mostrar siempre:
</text>
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 17e3b45beb..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,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Chat de texto" name="chat">
<text name="font_size">
- Font size:
+ Tamaño de la fuente:
</text>
<radio_group name="chat_font_size">
<radio_item label="Disminuir" name="radio" value="0"/>
- <radio_item label="Media" name="radio2" value="1"/>
+ <radio_item label="Medio" name="radio2" value="1"/>
<radio_item label="Aumentar" name="radio3" value="2"/>
</radio_group>
<text name="font_colors">
- Font colors:
+ Colores de la fuente:
</text>
<color_swatch label="Usted" name="user"/>
<text name="text_box1">
@@ -45,6 +45,13 @@
</text>
<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"/>
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 8993fa139f..ca157314aa 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
@@ -44,7 +44,7 @@
<radio_item label="On" name="radio2" value="1"/>
<radio_item label="Mostrar brevemente" name="radio3" value="2"/>
</radio_group>
- <check_box label="Mostrar mi nombre" name="show_my_name_checkbox1"/>
+ <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">
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 6ec3a04a02..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,8 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Gráficos" name="Display panel">
- <text name="UI Size:">
- Tamaño de la UI:
- </text>
<text name="QualitySpeed">
Calidad y velocidad:
</text>
@@ -52,7 +49,11 @@
m
</text>
<slider label="Núm. máx. de partículas:" name="MaxParticleCount"/>
- <slider label="Calidad del procesamiento:" label_width="142" name="RenderPostProcess"/>
+ <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>
@@ -87,8 +88,8 @@
Detalles de iluminación:
</text>
<radio_group name="LightingDetailRadio">
- <radio_item label="Sólo el Sol y la Luna" name="SunMoon"/>
- <radio_item label="Puntos de luz cercanos" name="LocalLights"/>
+ <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:
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 3632ecca7b..bf2c6b7aa6 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
@@ -18,7 +18,7 @@
<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">
- Localización de los registros:
+ Ruta de los registros:
</text>
<line_editor left="278" name="log_path_string" right="-20"/>
<button label="Elegir" label_selected="Elegir" name="log_path_button" width="120"/>
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 ebf2b1084b..fe9736f758 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
@@ -18,7 +18,7 @@
kbps
</text>
<check_box label="Personalizar el puerto" name="connection_port_enabled"/>
- <spinner label="Número de puerto:" name="connection_port"/>
+ <spinner label="Nº del puerto:" name="connection_port"/>
<text name="cache_size_label_l">
Tamaño de la caché
</text>
@@ -34,13 +34,16 @@
Web:
</text>
<radio_group name="use_external_browser">
- <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="0"/>
<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 initial_value="verdadero" label="Activar plugins" name="browser_plugins_enabled"/>
+ <check_box initial_value="verdadero" label="Aceptar las &apos;cookies&apos;" name="cookies_enabled"/>
+ <check_box initial_value="verdadero" label="Activar Javascript" name="browser_javascript_enabled"/>
<check_box initial_value="false" 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úmero de puerto:" name="web_proxy_port"/>
+ <spinner label="Nº del puerto:" name="web_proxy_port"/>
</panel>
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 53d05cf2c9..c51c3815d1 100644
--- a/indra/newview/skins/default/xui/es/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_estate.xml
@@ -39,7 +39,7 @@
</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
index 89ad5549c8..9ff88e2f79 100644
--- a/indra/newview/skins/default/xui/es/panel_region_general_layout.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_general_layout.xml
@@ -36,8 +36,8 @@
<combo_box.item label="General" name="PG"/>
</combo_box>
<button label="Aplicar" name="apply_btn"/>
- <button label="Teleportar a su Base a un usuario..." name="kick_btn"/>
- <button label="Teleportar a sus Bases a todos los usuarios..." name="kick_all_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 83c22d20eb..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"/>
diff --git a/indra/newview/skins/default/xui/es/panel_side_tray.xml b/indra/newview/skins/default/xui/es/panel_side_tray.xml
index 4e9834063b..cf5afb3cd1 100644
--- a/indra/newview/skins/default/xui/es/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/es/panel_side_tray.xml
@@ -3,27 +3,27 @@
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="Base." name="sidebar_home" tab_title="Home">
- <panel label="base" name="panel_home"/>
+ <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="My Profile">
+ <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="People">
+ <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="Places">
+ <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="My Inventory">
+ <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="My Appearance">
+ <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_world_map.xml b/indra/newview/skins/default/xui/es/panel_world_map.xml
index 77cec6b60b..b1dea02210 100644
--- a/indra/newview/skins/default/xui/es/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/es/panel_world_map.xml
@@ -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] personas
+ </panel.string>
<text label="N" name="floater_map_north" text="N">
N
</text>
diff --git a/indra/newview/skins/default/xui/es/sidepanel_appearance.xml b/indra/newview/skins/default/xui/es/sidepanel_appearance.xml
index 0c7f63d662..db5d47c11e 100644
--- a/indra/newview/skins/default/xui/es/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/es/sidepanel_appearance.xml
@@ -1,9 +1,13 @@
<?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">
- <text name="currentlook_title">
- (sin guardar)
+ <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"/>
diff --git a/indra/newview/skins/default/xui/es/sidepanel_inventory.xml b/indra/newview/skins/default/xui/es/sidepanel_inventory.xml
index 776b253adc..dcaddd8e42 100644
--- a/indra/newview/skins/default/xui/es/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/es/sidepanel_inventory.xml
@@ -3,6 +3,8 @@
<panel label="" name="sidepanel__inventory_panel">
<panel name="button_panel">
<button label="Perfil" name="info_btn"/>
+ <button label="Compartir" name="share_btn"/>
+ <button label="Comprar" name="shop_btn"/>
<button label="Ponerme" name="wear_btn"/>
<button label="Play" name="play_btn"/>
<button label="Teleporte" name="teleport_btn"/>
diff --git a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml
index 0cd3b40ca6..f40813d3c9 100644
--- a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="object properties" title="Perfil del objeto">
<panel.string name="text deed continued">
- Transfeir
+ Transferir
</panel.string>
<panel.string name="text deed">
- Transfeir
+ Transferir
</panel.string>
<panel.string name="text modify info 1">
Puedes modificar este objeto
@@ -38,16 +38,41 @@
</panel.string>
<text name="title" value="Perfil del objeto"/>
<text name="where" value="(en el mundo)"/>
- <panel label="">
+ <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
@@ -55,20 +80,27 @@
<text name="Anyone can:">
Cualquiera:
</text>
- <check_box label="Copiarlo" name="checkbox allow everyone copy"/>
- <check_box label="Moverlo" name="checkbox allow everyone move"/>
+ <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 en este objeto. Debes transferirlo para activar las restricciones según los roles."/>
+ <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="Modificarlo" name="checkbox next owner can modify"/>
- <check_box label="Copiarlo" name="checkbox next owner can copy"/>
- <check_box label="Transferirlo" name="checkbox next owner can transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/>
+ <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>
@@ -92,5 +124,6 @@
<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 619094bbfa..885e974b3b 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -14,7 +14,22 @@
Identificando el hardware...
</string>
<string name="StartupLoading">
- Cargando
+ 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.
@@ -73,8 +88,29 @@
<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.
+ 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
@@ -83,7 +119,25 @@
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
@@ -139,6 +193,24 @@
<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>
@@ -164,18 +236,40 @@
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>
@@ -215,6 +309,9 @@
<string name="GroupNameNone">
(ninguno)
</string>
+ <string name="AvalineCaller">
+ Avaline: [ORDER]
+ </string>
<string name="AssetErrorNone">
No hay ningún error
</string>
@@ -320,6 +417,9 @@
<string name="symbolic link">
el enlace
</string>
+ <string name="symbolic folder link">
+ enlace de la carpeta
+ </string>
<string name="AvatarAway">
Ausente
</string>
@@ -737,6 +837,45 @@
<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="next">
Siguiente
</string>
@@ -768,7 +907,7 @@
Ofrecimiento de teleporte
</string>
<string name="StartUpNotifications">
- Llegaron [%d] avisos nuevos mientras estabas ausente...
+ Llegaron avisos nuevos mientras estabas ausente...
</string>
<string name="OverflowInfoChannelString">
Tienes [%d] aviso/s más
@@ -804,7 +943,10 @@
Pulsa ESC para salir de la vista subjetiva
</string>
<string name="InventoryNoMatchingItems">
- No se han encontrado tales ítems en el inventario. Intenta con [secondlife:///app/search/groups &quot;Buscar&quot;].
+ ¿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.
@@ -825,6 +967,7 @@
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 :"/>
@@ -833,6 +976,7 @@
<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,"/>
@@ -892,7 +1036,7 @@
Partes del cuerpo
</string>
<string name="InvFolder Trash">
- la Papelera
+ Papelera
</string>
<string name="InvFolder Photo Album">
Ãlbum de fotos
@@ -918,6 +1062,9 @@
<string name="InvFolder My Outfits">
Mis vestuarios
</string>
+ <string name="InvFolder Accessories">
+ Accesorios
+ </string>
<string name="InvFolder Friends">
Amigos
</string>
@@ -1435,17 +1582,26 @@
<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)
+ (Por el nombre)
</string>
<string name="MuteAgent">
(Residente)
</string>
<string name="MuteObject">
- (objeto)
+ (Objeto)
</string>
<string name="MuteGroup">
- (grupo)
+ (Grupo)
+ </string>
+ <string name="MuteExternal">
+ (Externo)
</string>
<string name="RegionNoCovenant">
No se ha aportado un contrato para este estado.
@@ -1453,11 +1609,9 @@
<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">
- Última modificación:
- </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="never_text" value=" (nunca)"/>
<string name="GroupOwned">
Propiedad del grupo
</string>
@@ -1549,7 +1703,10 @@
Cancelar
</string>
<string name="UploadingCosts">
- Subir este/a [%s] cuesta
+ Subir [NAME] cuesta [AMOUNT] L$
+ </string>
+ <string name="BuyingCosts">
+ Comprar esto cuesta [AMOUNT] L$
</string>
<string name="UnknownFileExtension">
Extensión de archivo desconocida [.%s]
@@ -1828,7 +1985,7 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
Cortos
</string>
<string name="Attached Earlobes">
- Lóbulos cortos
+ Lóbulos
</string>
<string name="Back Fringe">
Nuca: largo
@@ -1921,7 +2078,7 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
Puente: ancho
</string>
<string name="Broad">
- Ancho
+ Aumentar
</string>
<string name="Brow Size">
Arco ciliar
@@ -2998,7 +3155,7 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
Sweep Forward
</string>
<string name="Tall">
- Alta
+ Más
</string>
<string name="Taper Back">
Cubierta trasera
@@ -3100,7 +3257,7 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
Pelo blanco
</string>
<string name="Wide">
- Ancho
+ Aumentar
</string>
<string name="Wide Back">
Completa
@@ -3129,6 +3286,15 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<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>
@@ -3159,6 +3325,12 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<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>
@@ -3186,11 +3358,17 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="IM_moderator_label">
(Moderador)
</string>
- <string name="started_call">
- Llamada de voz iniciada
+ <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="joined_call">
- Entrando a la llamada de voz
+ <string name="name_started_call">
+ [NAME] inició una llamada de voz
</string>
<string name="ringing-im">
Haciendo la llamada de voz...
@@ -3267,4 +3445,219 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<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="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>
</strings>
diff --git a/indra/newview/skins/default/xui/es/teleport_strings.xml b/indra/newview/skins/default/xui/es/teleport_strings.xml
index 0a605277f2..e0e0061729 100644
--- a/indra/newview/skins/default/xui/es/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/es/teleport_strings.xml
@@ -10,7 +10,7 @@ Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
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 @@ Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
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 21d0b6c10c..a1cbeecfb9 100644
--- a/indra/newview/skins/default/xui/fr/floater_about.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about.xml
@@ -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">
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 b5acd6299a..ff49fd4536 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -62,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>
@@ -267,7 +270,7 @@ ou divisé.
<text left_delta="214" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text left="4" name="Autoreturn" width="440">
+ <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"/>
@@ -324,18 +327,18 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<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"/>
+ <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"/>
+ <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>
@@ -400,7 +403,7 @@ 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"/>
+ <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 :
@@ -449,6 +452,9 @@ musique :
<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>
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 e0cb0ef524..aa42fe6150 100644
--- a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
@@ -142,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_textures.xml b/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml
index ae8f926d8f..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 &#10;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 corporelle 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"/>
+ <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_bulk_perms.xml b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml
index 241cf1af09..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,7 +1,7 @@
<?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">
Droits paramétrés sur [NAME]
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 c7437c4603..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,7 +4,7 @@
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
@@ -38,7 +38,7 @@ le Lindex...
Estimation en cours...
</text>
<text name="buy_action">
- [NAME] L$ [PRICE]
+ [ACTION]
</text>
<text name="total_label">
Mon nouveau solde sera de
@@ -53,14 +53,14 @@ le Lindex...
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" width="200" 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_color_picker.xml b/indra/newview/skins/default/xui/fr/floater_color_picker.xml
index 8d7fe76b35..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="220">
- (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 0343ff0014..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"/>
+ <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="Créer une chemise" label_selected="Créer une chemise" 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"/>
<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"/>
+ <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="Créer un pantalon" label_selected="Créer un pantalon" 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"/>
<text name="title">
[DESC]
</text>
@@ -246,11 +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"/>
+ <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">
@@ -279,11 +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"/>
+ <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">
@@ -313,11 +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"/>
+ <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">
@@ -346,11 +346,11 @@
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"/>
+ <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="Débardeur" name="Undershirt">
<text name="title">
@@ -375,15 +375,15 @@
<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">
+ <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"/>
+ <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="Caleçon" name="Underpants">
<text name="title">
@@ -408,15 +408,15 @@
<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">
+ <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"/>
+ <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">
@@ -445,11 +445,11 @@
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"/>
+ <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="Tatouage" name="Tattoo">
<text name="title">
@@ -523,7 +523,7 @@
</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" tool_tip="Afficher les scripts attachés à votre avatar"/>
+ <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 15cc6cd1ba..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" />
- <text name="WLCurKeyFrameText" width="170">
+ <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" width="170">
+ <text name="WLCurKeyTimeText">
Heure de la clé :
</text>
- <spinner label="Heure" name="WLCurKeyHour" label_width="80" width="74"/>
- <spinner label="Min" name="WLCurKeyMin" label_width="80"/>
+ <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" label_width="80" width="74" />
- <spinner label="Min" name="WLLengthOfDayMin" />
- <spinner label="S" name="WLLengthOfDaySec" label_width="10" width="50" left_delta="95"/>
- <text name="DayCycleText3" left="280" width="200">
- Prévisualiser :
- </text>
- <button label="Jouer" label_selected="Jouer" name="WLAnimSky" left_delta="90"/>
- <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" />
+ <spinner label="Heure" name="WLLengthOfDayHour"/>
+ <spinner label="Min" name="WLLengthOfDayMin"/>
+ <spinner label="S" name="WLLengthOfDaySec"/>
+ <text name="DayCycleText3">
+ 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_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 e20da40bcf..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,12 +2,11 @@
<floater name="godtools floater" title="OUTILS DIVINS">
<tab_container name="GodTools Tabs">
<panel label="Grille" name="grid">
- <button label="Éjecter tous les résidents" label_selected="Éjecter tous les résidents" 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."/>
@@ -55,8 +54,8 @@
<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_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_inventory_view_finder.xml b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
index 6cd886d4b9..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 e00f9564e8..02ac21bf82 100644
--- a/indra/newview/skins/default/xui/fr/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/fr/floater_joystick.xml
@@ -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,13 +44,13 @@
<text name="ZDeadZone">
Zone neutre Z
</text>
- <text left="4" name="PitchDeadZone" width="116">
+ <text name="PitchDeadZone">
Zone neutre tangage
</text>
- <text name="YawDeadZone" left="10" width="104">
+ <text name="YawDeadZone">
Zone neutre lacet
</text>
- <text name="RollDeadZone" left="10" width="104">
+ <text name="RollDeadZone">
Zone neutre roulis
</text>
<text name="Feathering">
@@ -59,7 +59,7 @@
<text name="ZoomScale2">
Échelle du zoom
</text>
- <text left="6" name="ZoomDeadZone" width="120">
+ <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_map.xml b/indra/newview/skins/default/xui/fr/floater_map.xml
index e01b687fce..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" title="Mini-carte">
+<floater name="Map" title="">
<floater.string name="mini_map_north">
N
</floater.string>
diff --git a/indra/newview/skins/default/xui/fr/floater_moveview.xml b/indra/newview/skins/default/xui/fr/floater_moveview.xml
index fac569557e..c0f3864b81 100644
--- a/indra/newview/skins/default/xui/fr/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_moveview.xml
@@ -6,18 +6,48 @@
<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>
@@ -28,10 +58,12 @@
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>
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 2420c2b04b..089d710f17 100644
--- a/indra/newview/skins/default/xui/fr/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/fr/floater_outgoing_call.xml
@@ -28,7 +28,7 @@
Vous avez été déconnecté(e) de [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
</text>
<text name="nearby_P2P_by_other">
- [VOICE_CHANNEL_NAME] a mis fin à l&apos;appel. [RECONNECT_NEARBY]
+ Votre appel a pris fin. [RECONNECT_NEARBY]
</text>
<text name="nearby_P2P_by_agent">
Vous avez mis fin à l&apos;appel. [RECONNECT_NEARBY]
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 f83000cf87..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,10 +1,10 @@
<?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"/>
<check_box label="Autoriser tout le monde à copier" name="everyone_copy"/>
- <text name="NextOwnerLabel" width="260">
+ <text name="NextOwnerLabel">
Le prochain propriétaire pourra :
</text>
<check_box label="Modifier" name="next_owner_modify"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_postcard.xml b/indra/newview/skins/default/xui/fr/floater_postcard.xml
index 489b90eeba..0f3a4541e2 100644
--- a/indra/newview/skins/default/xui/fr/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/fr/floater_postcard.xml
@@ -13,10 +13,10 @@
</text>
<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="130" left_delta="146"/>
- <line_editor label="Saisissez votre sujet ici." name="subject_form"/>
+ <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 406e91a18a..052e43388b 100644
--- a/indra/newview/skins/default/xui/fr/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preferences.xml
@@ -1,8 +1,8 @@
<?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"/>
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_snapshot.xml b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
index ccb862acac..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="44" name="snapshot_width" width="101"/>
- <spinner label="Hauteur" label_width="46" 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="Conserver les proportions" name="keep_aspect_check"/>
- <check_box label="Figer l&apos;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 47b761aed9..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,5 +1,5 @@
<?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">
CONVERSATIONS
</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml
index 40765b9e06..c9b8c42dfb 100644
--- a/indra/newview/skins/default/xui/fr/floater_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tools.xml
@@ -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"/>
@@ -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>
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_water.xml b/indra/newview/skins/default/xui/fr/floater_water.xml
index 6d697b40d3..96723b0fe6 100644
--- a/indra/newview/skins/default/xui/fr/floater_water.xml
+++ b/indra/newview/skins/default/xui/fr/floater_water.xml
@@ -1,10 +1,10 @@
<?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" width="120">
- Préréglages eau :
+ 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"/>
@@ -34,7 +34,7 @@
Décalage Fresnel
</text>
<text name="DensMultText">
- Réfraction au dessus
+ Réfraction au-dessus
</text>
<text name="WaterScaleBelowText">
Réfraction en dessous
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 9f93302b71..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,7 +1,7 @@
<?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"/>
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 f8e1926586..4d500857ea 100644
--- a/indra/newview/skins/default/xui/fr/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/fr/floater_world_map.xml
@@ -20,7 +20,7 @@
Vente de terrains
</text>
<text name="by_owner_label">
- par le propriétaire
+ propriétaire
</text>
<text name="auction_label">
enchères
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 8d51c1b4e3..f48513eb2b 100644
--- a/indra/newview/skins/default/xui/fr/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/fr/menu_attachment_other.xml
@@ -10,7 +10,7 @@
<menu_item_call label="Signaler" name="abuse"/>
<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 b42271e969..08d1a20361 100644
--- a/indra/newview/skins/default/xui/fr/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/fr/menu_avatar_other.xml
@@ -10,7 +10,7 @@
<menu_item_call label="Signaler" name="abuse"/>
<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 e370e8d3b8..3620dc72b0 100644
--- a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
@@ -10,8 +10,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="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"/>
@@ -20,8 +20,11 @@
<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 0da9a1806d..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
@@ -11,7 +11,7 @@
<menu_item_call label="Signaler" name="report"/>
<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"/>
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 2f6f25dc6b..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"/>
@@ -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"/>
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_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_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_profile_overflow.xml b/indra/newview/skins/default/xui/fr/menu_profile_overflow.xml
index 58bd16064a..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,5 +1,6 @@
<?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"/>
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 5925d28565..4c7cdefbe8 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -7,7 +7,7 @@
</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_check label="Mon inventaire" name="ShowSidetrayInventory"/>
<menu_item_check label="Mes gestes" name="Gestures"/>
@@ -31,6 +31,7 @@
<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="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>
@@ -66,17 +67,6 @@
<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"/>
@@ -124,6 +114,7 @@
<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"/>
@@ -145,7 +136,6 @@
<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"/>
@@ -172,6 +162,7 @@
<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 label="Raccourcis" name="Shortcuts">
@@ -198,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"/>
@@ -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 0fb609d653..4c4c01f34a 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -178,7 +178,7 @@ Voulez-vous continuer ?
<notification name="JoinGroupNoCost">
Vous vous apprêtez à rejoindre le groupe [NAME].
Voulez-vous continuer ?
- <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Fusionner"/>
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Rejoindre"/>
</notification>
<notification name="JoinGroupCannotAfford">
Rejoindre ce groupe coûte [COST] L$.
@@ -283,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">
@@ -325,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.
@@ -351,7 +354,7 @@ Voulez-vous vraiment continuer ?
<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">
@@ -608,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>
@@ -925,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"/>
@@ -953,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é.
@@ -1101,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>
@@ -1407,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">
@@ -1489,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.
@@ -1913,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>
@@ -1941,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>
@@ -2254,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]
@@ -2286,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"/>
@@ -2306,11 +2372,11 @@ 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"/>
@@ -2373,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>
@@ -2414,14 +2483,6 @@ Accepter cette requête ?
<button name="Ignore" text="Ignorer"/>
</form>
</notification>
- <notification name="ScriptToast">
- Le/La [TITLE] de [FIRST] [LAST] demande la participation du résident.
- <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.
@@ -2577,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_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..afd9001df0
--- /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="Permuter" 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 d3e4afd6ee..328b97ee72 100644
--- a/indra/newview/skins/default/xui/fr/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/fr/panel_bottomtray.xml
@@ -1,11 +1,7 @@
<?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">
@@ -24,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_classified_info.xml b/indra/newview/skins/default/xui/fr/panel_classified_info.xml
index e064846c48..e4aecfdfc0 100644
--- a/indra/newview/skins/default/xui/fr/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/fr/panel_classified_info.xml
@@ -34,14 +34,14 @@
<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="[prix]"/>
+ <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="[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="Renouvellement automatique :"/>
+ <text name="auto_renew_label" value="Renouv. auto :"/>
<text name="auto_renew" value="Activé"/>
</layout_panel>
<layout_panel name="descr_layout_panel">
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..24cb92dde7
--- /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="Ajouter +" 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_classified.xml b/indra/newview/skins/default/xui/fr/panel_edit_classified.xml
index 9ea7ff8122..2e2b848c93 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_classified.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_classified.xml
@@ -38,7 +38,7 @@
</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">
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 73e136ade6..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" width="80" 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 cee44eb795..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" width="80" 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 71d82c817f..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" width="80" 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..0bbcbe833f 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_pick.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Modifier la préférence" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (mise à jour après enregistrement)
+ </panel.string>
<text name="title">
Modifier la préférence
</text>
@@ -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 7c8365fdee..4be12054df 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
@@ -40,7 +40,7 @@
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]"/>
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 cf28cd8c1e..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" width="80" 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 a8e0910a15..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" width="80" 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 dac005f6b6..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" width="76" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Tatouage haut" name="Upper Tattoos" width="80" 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 e9784b9510..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" width="80" 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 6fc6a3dc77..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" width="80" 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 7ab2aa6bc9..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" width="76" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Tatouage haut" name="Upper Tattoo" width="80" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Tatouage bas" name="Lower Tattoo" width="76" 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 90dcae18ec..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" width="80" 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="Caleçon"/>
- </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 950cdd7639..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" width="80" 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="Débardeur"/>
- </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 75b6c044f6..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="Rétablir" width="130" name="revert_button"/>
+ <button label="Rétablir" name="revert_button" width="130"/>
</panel>
</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 cf71a28451..20cb5bd974 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_general.xml
@@ -47,8 +47,11 @@ Faites glisser le pointeur de la souris sur les options pour en savoir plus.
<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."/>
<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>
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 a10eaf9d18..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
@@ -6,6 +6,9 @@
<panel.string name="cant_view_group_land_text">
Vous n&apos;avez pas la permission de voir quel terrain possède ce groupe
</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.
</panel.string>
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 35a5caaa92..bcb6abcac6 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_notices.xml
@@ -42,6 +42,7 @@ Vous pouvez désactiver la réception des notices dans l&apos;onglet Général.
<text name="string">
Faire glisser l&apos;objet et le déposer ici pour le joindre :
</text>
+ <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."/>
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_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml
index 209a803e07..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="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" 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 5faba01339..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="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>
- <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_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_nearby_media.xml b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml
index 71e65232aa..36388b0bc1 100644
--- a/indra/newview/skins/default/xui/fr/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml
@@ -1,5 +1,8 @@
<?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>
@@ -13,16 +16,18 @@
(lecture en cours)
</string>
<panel name="minimized_controls">
- <button label="Tout arrêter" name="all_nearby_media_disable_btn" tool_tip="Désactiver tous les médias près de vous"/>
- <button label="Tout lancer" name="all_nearby_media_enable_btn" tool_tip="Activer tous les médias près de vous"/>
+ <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_less_btn" tool_tip="Options avancées"/>
+ <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="Dans cette parcelle" name="WithinParcel"/>
+ <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"/>
@@ -37,13 +42,13 @@
<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="Jouer le média sélectionné"/>
+ <button name="play_btn" tool_tip="Lire le média sélectionné"/>
</layout_panel>
<layout_panel name="pause">
- <button name="pause_btn" tool_tip="Pauser le média sélectionné"/>
+ <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 pour le média sélectionné"/>
+ <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é"/>
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 9b9d830aaf..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,7 +1,7 @@
<?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"/>
+ <panel label="MES TENUES" name="outfitslist_tab"/>
<inventory_panel label="PORTÉ" name="cof_tab"/>
</tab_container>
<panel name="bottom_panel">
@@ -9,6 +9,6 @@
<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 8d17d9ffdf..186ca51772 100644
--- a/indra/newview/skins/default/xui/fr/panel_people.xml
+++ b/indra/newview/skins/default/xui/fr/panel_people.xml
@@ -1,14 +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_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="[secondlife:///app/search/groups Trouver le groupe via la recherche ?]"/>
- <string name="no_groups_msg" value="[secondlife:///app/search/groups Rechercher des groupes à rejoindre.]"/>
+ <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">
@@ -27,10 +36,6 @@
<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>
- <text name="no_friends_msg">
- Pour ajouter des amis, utilisez la [secondlife:///app/search/people recherche] ou cliquez-droit sur le résident à ajouter comme ami.
-Si vous souhaitez rencontrer d&apos;autres résidents, cliquez sur [secondlife:///app/worldmap la carte].
- </text>
</panel>
<panel label="MES GROUPES" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
@@ -50,7 +55,7 @@ Si vous souhaitez rencontrer d&apos;autres résidents, cliquez sur [secondlife:/
<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="Partager" name="share_btn" tool_tip="Partager un article d&apos;inventaire"/>
<button label="Téléporter" name="teleport_btn" tool_tip="Proposez 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"/>
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 f2bdb3d745..598e94166e 100644
--- a/indra/newview/skins/default/xui/fr/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_place_profile.xml
@@ -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.
diff --git a/indra/newview/skins/default/xui/fr/panel_places.xml b/indra/newview/skins/default/xui/fr/panel_places.xml
index f0c40d7e92..9990c4612d 100644
--- a/indra/newview/skins/default/xui/fr/panel_places.xml
+++ b/indra/newview/skins/default/xui/fr/panel_places.xml
@@ -1,7 +1,7 @@
<?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"/>
+ <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"/>
@@ -11,5 +11,6 @@
<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 b47ed4bd8b..2a7691ea0a 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
@@ -3,6 +3,9 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
+ <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">
@@ -10,6 +13,7 @@
</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="Apparence" name="appearance_camera_movement" tool_tip="Utiliser le positionnement automatique de la caméra quand je suis en mode Édition"/>
+ <check_box initial_value="1" 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"/>
@@ -17,6 +21,9 @@
<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="Chat près de moi" name="0"/>
@@ -26,4 +33,5 @@
<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" 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_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
index 7e6e96aa49..76f3319525 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
@@ -45,7 +45,13 @@
</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="Onglets" name="radio2" value="1"/>
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 450ad64ae4..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,19 +1,5 @@
<?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>
@@ -63,6 +49,10 @@
m
</text>
<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_setup.xml b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
index ecea368c54..eae49e7810 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
@@ -34,9 +34,12 @@
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]." value="0"/>
<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="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 :
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 8cb4641937..f801aee312 100644
--- a/indra/newview/skins/default/xui/fr/panel_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_profile.xml
@@ -42,8 +42,8 @@
</layout_panel>
<layout_panel name="profile_buttons_panel">
<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" width="30"/>
- <button label="Appeler" name="call" tool_tip="Appeler ce résident" width="60"/>
+ <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="▼" name="overflow_btn" tool_tip="Payer ou partager l&apos;inventaire avec le résident"/>
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 cd1d0c4886..a30306d116 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_covenant.xml
@@ -70,13 +70,12 @@ toutes les parcelles du domaine.
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_texture.xml b/indra/newview/skins/default/xui/fr/panel_region_texture.xml
index be7ca456f1..c0b667137a 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_texture.xml
@@ -43,10 +43,10 @@
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_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
index 657bf792cf..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,7 +22,7 @@
[AMT] L$
</panel.string>
<button label="" label_selected="" name="buycurrency" tool_tip="Mon solde"/>
- <button label="Acheter" 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)">
00h00 PST
</text>
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/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 cc99b1a07c..c8e76118a1 100644
--- a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
@@ -100,7 +100,7 @@
<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"/>
+ <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 :
</text>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index f759f5f41a..742f024d0d 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>
@@ -230,6 +324,9 @@
<string name="GroupNameNone">
(aucun)
</string>
+ <string name="AvalineCaller">
+ Appelant Avaline [ORDER]
+ </string>
<string name="AssetErrorNone">
Aucune erreur
</string>
@@ -335,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>
@@ -758,6 +858,42 @@
<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>
@@ -828,7 +964,10 @@
Appuyez sur ESC pour quitter la vue subjective
</string>
<string name="InventoryNoMatchingItems">
- Aucun objet correspondant dans l&apos;inventaire. Essayer la [secondlife:///app/search/groups &quot;Recherche&quot;].
+ 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.
@@ -849,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>
@@ -863,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,"/>
@@ -948,6 +1089,9 @@
<string name="InvFolder My Outfits">
Mes tenues
</string>
+ <string name="InvFolder Accessories">
+ Accessoires
+ </string>
<string name="InvFolder Friends">
Amis
</string>
@@ -1471,6 +1615,9 @@
<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>
@@ -1486,15 +1633,16 @@
<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="covenant_last_modified" value="Dernière modification :"/>
<string name="none_text" value=" (aucun)"/>
<string name="never_text" value=" (jamais)"/>
<string name="GroupOwned">
@@ -1588,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
@@ -1999,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
@@ -2149,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
@@ -2272,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
@@ -2389,7 +2540,7 @@ 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">
Mâchoire
@@ -2473,7 +2624,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Fente labiale
</string>
<string name="Lip Cleft Depth">
- Fente labiale
+ Prof. fente labiale
</string>
<string name="Lip Fullness">
Volume des lèvres
@@ -2557,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
@@ -2731,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
@@ -2833,10 +2984,10 @@ 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">
Pointue
@@ -2860,7 +3011,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Plus
</string>
<string name="Puffy Eyelids">
- Cernes
+ Paup. gonflées
</string>
<string name="Rainbow Color">
Couleur arc en ciel
@@ -2926,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
@@ -3034,7 +3185,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Cheveux lisses
</string>
<string name="Socks Length">
- Longueur des chaussettes
+ Longueur
</string>
<string name="Soulpatch">
Barbichette
@@ -3124,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
@@ -3151,7 +3302,7 @@ 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
@@ -3225,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>
@@ -3255,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>
@@ -3282,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...
@@ -3375,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/it/floater_about.xml b/indra/newview/skins/default/xui/it/floater_about.xml
index a2fcaa63f6..55e699612c 100644
--- a/indra/newview/skins/default/xui/it/floater_about.xml
+++ b/indra/newview/skins/default/xui/it/floater_about.xml
@@ -1,26 +1,26 @@
<?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]
@@ -35,7 +35,7 @@ Versione Vivox: [VIVOX_VERSION]
(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..c55f79738e 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
@@ -70,7 +79,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 +90,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 +137,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 +193,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 +219,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 +243,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 +251,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 +259,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 +294,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 +315,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 +335,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 +355,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 +369,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 +397,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 +409,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 +427,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 +455,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 +470,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..2935f0fdb6 100644
--- a/indra/newview/skins/default/xui/it/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/it/floater_avatar_textures.xml
@@ -1,5 +1,5 @@
<?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>
@@ -7,26 +7,37 @@
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">
+ <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>
+ </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_land.xml b/indra/newview/skins/default/xui/it/floater_buy_land.xml
index 9fa5bd5570..2e78168209 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,132 @@
<?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>
+ <floater.string name="icon_PG" value="Parcel_PG_Dark"/>
+ <floater.string name="icon_M" value="Parcel_M_Dark"/>
+ <floater.string name="icon_R" value="Parcel_R_Dark"/>
<text name="region_name_label">
Regione:
</text>
@@ -58,8 +185,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 +202,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 +226,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 +234,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..febbfd2739 100644
--- a/indra/newview/skins/default/xui/it/floater_camera.xml
+++ b/indra/newview/skins/default/xui/it/floater_camera.xml
@@ -9,23 +9,35 @@
<floater.string name="move_tooltip">
Muovi la telecamera su e giù e a sinistra e destra
</floater.string>
+ <floater.string name="orbit_mode_title">
+ Ruota visuale
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ Panoramica
+ </floater.string>
+ <floater.string name="avatar_view_mode_title">
+ Valori predefiniti
+ </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"/>
+ <joystick_track name="cam_track_stick" tool_tip="Sposta la visuale in su e in giù, a sinistra e a destra"/>
<panel name="zoom" tool_tip="Avvicina la telecamera nell&apos;inquadratura">
- <slider_bar name="zoom_slider" tool_tip="Zoom verso il focus"/>
+ <slider_bar name="zoom_slider" tool_tip="Zoom verso il centro focale"/>
</panel>
- <joystick_rotate name="cam_rotate_stick" tool_tip="Ruota la visuale intorno al focus"/>
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Ruota la visuale intorno al punto focale"/>
<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"/>
+ <button name="group_view" tool_tip="Visuale di gruppo"/>
+ <button name="front_view" tool_tip="Visuale frontale"/>
+ <button name="mouselook_view" tool_tip="Visuale soggettiva"/>
</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="pan_btn" tool_tip="Visuale panoramica"/>
+ <button label="" name="avatarview_btn" tool_tip="Valori predefiniti"/>
<button label="" name="freecamera_btn" tool_tip="Vedi oggetto"/>
</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..81a6ea7a60 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,22 @@
<?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 accettato una chiamata in Chat vocale con il gruppo [GROUP].
</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..70ab8dcb5a 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="Mini mappa">
<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..26d861c566 100644
--- a/indra/newview/skins/default/xui/it/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/it/floater_moveview.xml
@@ -1,35 +1,43 @@
<?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="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="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="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="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 E"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Vola in basso, premi C"/>
+ <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..70e28dde35 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_notecard.xml
@@ -1,13 +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]
+ Biglietto: [NAME]
</floater.string>
<floater.string label="Salva" label_selected="Salva" name="Save">
Salva
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..2f5c86985c 100644
--- a/indra/newview/skins/default/xui/it/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/it/floater_snapshot.xml
@@ -1,80 +1,16 @@
<?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"/>
+ <button label="Condividi foto" name="share"/>
+ <button label="Condividi su Web" name="share_to_web"/>
+ <button label="Salva nell&apos;inventario" name="save_to_inventory"/>
+ <button label="Salva foto" name="save"/>
+ <button label="Invia foto via e-mail" name="share_to_email"/>
+ <button label="Salva sul mio computer" name="save_to_computer"/>
+ <button label="Imposta come foto del profilo" name="set_profile_pic"/>
+ <button label="Indietro" name="cancel"/>
</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..04d61b97ff 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 name="checkbox uniform"/>
+ <text name="checkbox uniform label">
+ Ridimens. simmetricamente
+ </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..07368da0dd 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,26 @@
<?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_panel>
- </layout_stack>
- </panel>
+ <layout_stack name="my_call_stack">
+ <layout_panel name="my_panel">
+ <text name="user_text" value="Il mio avatar:"/>
+ </layout_panel>
+ <layout_panel name="leave_call_btn_panel">
+ <button label="Abbandona chiamata" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
</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 1b47dd7d7e..31d7a8df9e 100644
--- a/indra/newview/skins/default/xui/it/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/it/floater_world_map.xml
@@ -5,71 +5,66 @@
Legenda
</text>
</panel>
- <panel
- name="layout_panel_2">
- <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 initial_value="vero" 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
- name="layout_panel_3">
+ <panel name="layout_panel_3">
<text name="find_on_map_label">
- Trova sulla Mappa
+ Trova sulla mappa
</text>
</panel>
- <panel
- name="layout_panel_4">
- <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
- name="layout_panel_5">
+ <panel name="layout_panel_5">
<text name="zoom_label">
- Zoom
+ Ingrandisci
</text>
</panel>
- <panel
- name="layout_panel_6">
- <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..fd58c18e0b 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,14 @@ owner [OWNER]
Tocca
</string>
<string name="Sit">
- Siedi
+ Siediti
</string>
- <button label="Compra" name="buy_btn"/>
+ <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..054f4802e6 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="Il mio aspetto" name="Appearance..."/>
+ <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..d73d97d499 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,16 @@
<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="Il mio aspetto" name="Appearance..."/>
+ <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..7203d002d2 100644
--- a/indra/newview/skins/default/xui/it/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/it/menu_bottomtray.xml
@@ -2,11 +2,11 @@
<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_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_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..ee50a18ba5 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,5 @@
<?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>
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..33229bb7c0 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="Il mio aspetto" name="my_appearance"/>
<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..3b36198774 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,64 @@
<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="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..."/>
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..904b819198 100644
--- a/indra/newview/skins/default/xui/it/menu_login.xml
+++ b/indra/newview/skins/default/xui/it/menu_login.xml
@@ -6,25 +6,18 @@
</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_participant_list.xml b/indra/newview/skins/default/xui/it/menu_participant_list.xml
index 33c8fc404d..71f1a9a0da 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="Disattiva audio di tutti gli altri" name="ModerateVoiceMuteOthers"/>
+ <menu_item_call label="Riattiva audio di questo participante" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Riattiva audio di tutti gli altri" name="ModerateVoiceUnMuteOthers"/>
+ </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..ac7b40ca48
--- /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 come nuovo" 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..a5923ac42b 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -2,161 +2,147 @@
<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="Il mio aspetto" name="Appearance"/>
+ <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 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>
- <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="Collegamento" name="Link"/>
+ <menu_item_call label="Scollega" name="Unlink"/>
+ <menu_item_check label="Modifica le parti collegate" name="Edit Linked Parts"/>
+ <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="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>
<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 +152,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_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_item_call label="Alterna schermo intero" name="Toggle Fullscreen"/>
</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/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..4739e5cce9 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.
@@ -304,11 +327,11 @@ Hai bisogno di un account per entrare in [SECOND_LIFE]. Ne vuoi creare uno adess
<usetemplate name="okcancelbuttons" notext="Riprova" yestext="Crea un nuovo account"/>
</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 +339,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 +368,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 +428,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,28 +443,27 @@ 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.
@@ -600,14 +618,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 +654,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 +679,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 +728,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 +757,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 +768,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 +777,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 +806,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 +844,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 +895,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 +924,16 @@ 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 name="RemoveFromFriends">
Vuoi rimuovere remove [FIRST_NAME] [LAST_NAME] dalla lista dei tuoi amici?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
@@ -1043,37 +1067,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>
@@ -1095,10 +1121,10 @@ Scegli un avatar maschile o femminile. Puoi sempre cambiare idea più tardi.
[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 +1203,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 +1311,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 +1339,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 +1373,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 +1383,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 +1403,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 +1413,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 +1437,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 +1504,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 tua 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.
+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.
<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 +1535,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 +1559,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 +1603,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 +1622,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 +1718,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 +1771,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 +1793,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 +1803,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 +1829,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 +1904,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 +1924,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 +1938,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 +1963,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 +1987,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 +1999,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 +2044,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 +2057,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 +2075,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 +2092,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 +2132,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 +2154,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 +2166,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 +2194,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,7 +2275,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]:
+ Un oggetto denominato [OBJECTFROMNAME] di proprietà di [NAME_SLURL] ti ha dato questo [OBJECTTYPE]:
[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Prendi"/>
@@ -2239,7 +2284,7 @@ Riprova tra qualche istante.
</form>
</notification>
<notification name="ObjectGiveItemUnknownUser">
- Un oggetto di nome [OBJECTFROMNAME] posseduto da un residente sconosciuto ti ha dato [OBJECTTYPE]:
+ Un oggetto chiamato [OBJECTFROMNAME] di proprietà di (residente sconosciuto) ti ha dato questo [OBJECTTYPE]:
[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Prendi"/>
@@ -2248,12 +2293,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 +2315,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 +2335,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 +2363,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 +2402,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 +2423,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 +2446,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 +2459,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 +2477,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 +2495,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 +2505,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 +2519,25 @@ 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="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 +2552,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 +2570,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 +2595,25 @@ 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">
+ Trascina articoli dell&apos;inventario su una persona nel selettore residenti
+ </notification>
+ <notification name="AvatarRezNotification">
+ Avatar &apos;[NAME]&apos; rezzato in [TIME] secondi.
</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 +2628,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_bottomtray.xml b/indra/newview/skins/default/xui/it/panel_bottomtray.xml
index f2aab63dce..c0218fad5e 100644
--- a/indra/newview/skins/default/xui/it/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/it/panel_bottomtray.xml
@@ -1,23 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="bottom_tray">
<string name="SpeakBtnToolTip">
- Microfono on/off
+ Accende o spegne il microfono
</string>
<string name="VoiceControlBtnToolTip">
- Mostra/nascondi il pannello voice control
+ Mostra o nasconde il pannello di regolazione voce
</string>
<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="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_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..7e1ba43756 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_shape.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_shape.xml
@@ -5,19 +5,21 @@
Sesso:
</text>
<radio_group name="sex_radio">
- <radio_item label="Femminile" name="radio"/>
- <radio_item label="Maschile" name="radio2"/>
+ <radio_item label="Femmina" name="radio"/>
+ <radio_item label="Maschio" name="radio2"/>
</radio_group>
</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 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>
</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..d8cfa15b25 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,8 @@
<?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"/>
</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..1135a582f5 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:
@@ -90,9 +90,14 @@
<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:"/>
+ </panel>
+ <panel label="gear_buttom_panel" name="gear_buttom_panel">
+ <button name="friends_viewsort_btn" tool_tip="Opzioni"/>
+ <button name="add_btn" tool_tip="TODO"/>
+ <button name="del_btn" tool_tip="TODO"/>
</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..1e3ef5e657 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,81 @@
<?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="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..9dac282de9 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,16 @@ 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="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 +57,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..287e938d57 100644
--- a/indra/newview/skins/default/xui/it/panel_login.xml
+++ b/indra/newview/skins/default/xui/it/panel_login.xml
@@ -12,22 +12,33 @@
Nome:
</text>
<line_editor label="Nome" name="first_name_edit" tool_tip="[SECOND_LIFE] First Name"/>
+ <text name="last_name_text">
+ Cognome:
+ </text>
<line_editor label="Cognome" name="last_name_edit" tool_tip="[SECOND_LIFE] Last Name"/>
- <check_box label="Ricordare" name="remember_check"/>
+ <text name="password_text">
+ Password:
+ </text>
+ <check_box label="Ricorda password" name="remember_check"/>
<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"/>
+ <button label="Accedi" 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..878daf1e6b 100644
--- a/indra/newview/skins/default/xui/it/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/it/panel_main_inventory.xml
@@ -1,18 +1,14 @@
<?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>
- <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"/>
- </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>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] oggetti [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ Oggetti:
+ </text>
<menu_bar name="Inventory Menu">
<menu label="File" name="File">
<menu_item_call label="Apri" name="Open"/>
@@ -22,43 +18,53 @@
<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_item_call label="Nuova finestra" name="New Window"/>
+ <menu_item_call label="Mostra filtri" name="Show Filters"/>
+ <menu_item_call label="Ripristina 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_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>
<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="In base al nome" name="By Name"/>
+ <menu_item_check label="In base alla data" name="By Date"/>
+ <menu_item_check label="Cartelle sempre in base al nome" name="Folders Always By Name"/>
<menu_item_check label="Cartelle di sistema all&apos;inizio" name="System Folders To Top"/>
</menu>
</menu_bar>
+ <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"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Mostra opzioni addizionali"/>
+ <button name="add_btn" tool_tip="Aggiungi nuovo elemento"/>
+ <dnd_button name="trash_btn" tool_tip="Rimuovi l&apos;articolo selezionato"/>
+ </panel>
</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 f7a58581d4..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
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="chat_bar">
- <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"/>
+ <string name="min_width">
+ 192
+ </string>
+ <string name="max_width">
+ 320
+ </string>
+ <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..516181e0e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_outfit_edit.xml
@@ -0,0 +1,48 @@
+<?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"/>
+ <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"/>
+ <button label="modifica" name="edit_wearable_btn"/>
+ <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..."/>
+ <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">
+ <scroll_list name="look_items_list">
+ <scroll_list.columns label="Articolo look" name="look_item"/>
+ <scroll_list.columns label="Ordina in base agli articoli del vestiario" name="look_item_sort"/>
+ </scroll_list>
+ <panel label="bottom_panel" name="edit_panel"/>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel">
+ <filter_editor label="Filtro" name="look_item_filter"/>
+ <layout_stack name="filter_panels">
+ <layout_panel label="Pannello di controllo IM" name="filter_button_panel">
+ <text name="add_to_outfit_label" value="Aggiungi al vestiario:"/>
+ <button label="V" name="filter_button"/>
+ </layout_panel>
+ </layout_stack>
+ <panel label="add_wearables_button_bar" name="add_wearables_button_bar">
+ <button label="C" name="folder_view_btn"/>
+ <button label="E" name="list_view_btn"/>
+ </panel>
+ </layout_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..932788eaa3 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,14 @@
<?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 vestiario" name="make_outfit_btn" tool_tip="Salva questo aspetto fisico come un vestito"/>
+ <button label="Indossa" name="wear_btn" tool_tip="Indossa il vestiario selezionato"/>
+ <button label="Modifica vestiario" name="edit_current_outfit_btn"/>
+ </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..c469da014a 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 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 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 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 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="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 03716ba4c5..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">
+ <accordion_tab name="parcel_characteristics_tab" title="Lotto">
<panel name="parcel_characteristics_panel">
- <text name="rating_label" value="Valutazione:"/>
+ <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 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 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 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..3b242b1805 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="Teleport" name="teleport_btn" tool_tip="Teleport alla zona selezionata"/>
<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="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"/>
</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..09e19f4bc0 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,36 @@
<?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 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..28df9d2e43 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,15 @@
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"/>
+ <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..5bd0cfb106 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Grafica" name="Display panel">
<text name="UI Size:">
- misura UI:
+ Dimensioni UI:
</text>
<text name="QualitySpeed">
Qualità e velocità:
@@ -47,12 +47,12 @@
<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="Qualità in post-produzione:" name="RenderPostProcess"/>
<text name="MeshDetailText">
Dettagli reticolo:
</text>
@@ -87,8 +87,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 +99,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..cedf93beed 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 initial_value="vero" label="Abilita plugin" name="browser_plugins_enabled"/>
+ <check_box initial_value="vero" label="Accetta cookie" name="cookies_enabled"/>
+ <check_box initial_value="vero" label="Abilita Javascript" name="browser_javascript_enabled"/>
+ <check_box initial_value="false" 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..6936f24a8a 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" value="vero"/>
+ <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" value="vero"/>
+ <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..4c860ff479 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,11 @@
<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
+ <button label="" label_selected="" name="buycurrency" tool_tip="Il mio saldo"/>
+ <button label="Acquista L$" name="buyL" tool_tip="Clicca per comprare più L$"/>
+ <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_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..c2e99b5573 100644
--- a/indra/newview/skins/default/xui/it/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/it/sidepanel_appearance.xml
@@ -1,11 +1,10 @@
<?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"/>
+ <panel name="panel_currentlook">
+ <text name="currentlook_title">
+ (non salvato)
+ </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..8a391c882c 100644
--- a/indra/newview/skins/default/xui/it/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/it/sidepanel_inventory.xml
@@ -3,6 +3,7 @@
<panel label="" name="sidepanel__inventory_panel">
<panel name="button_panel">
<button label="Profilo" name="info_btn"/>
+ <button label="Condividi" name="share_btn"/>
<button label="Indossa" name="wear_btn"/>
<button label="Riproduci" name="play_btn"/>
<button label="Teleport" name="teleport_btn"/>
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 0eecdfb2a2..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 name="properties_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_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..9a6c648c8e 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
@@ -79,8 +97,11 @@
<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 +109,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 +179,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 +209,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 +223,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 +270,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 +294,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 +343,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 +385,7 @@
immagine targa
</string>
<string name="trash">
- cestino
+ Cestino
</string>
<string name="jpeg image">
immagine jpeg
@@ -329,6 +405,9 @@
<string name="symbolic link">
link
</string>
+ <string name="symbolic folder link">
+ link alla cartella
+ </string>
<string name="AvatarAway">
Assente
</string>
@@ -546,7 +625,7 @@
Si
</string>
<string name="texture_loading">
- In Caricamento...
+ Caricamento in corso...
</string>
<string name="worldmap_offline">
Offline
@@ -581,6 +660,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 +703,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
@@ -684,25 +766,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 +799,7 @@
Scarpe
</string>
<string name="socks">
- Calze
+ Calzini
</string>
<string name="jacket">
Giacca
@@ -729,7 +811,7 @@
Maglietta intima
</string>
<string name="underpants">
- slip
+ Slip
</string>
<string name="skirt">
Gonna
@@ -743,17 +825,20 @@
<string name="invalid">
non valido
</string>
+ <string name="NewWearable">
+ Nuovo [WEARABLE_ITEM]
+ </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 +847,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 +856,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 +892,52 @@
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 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="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 +954,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 +1005,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 +1050,7 @@ di questa texture in inventario.
Luce
</string>
<string name="KBShift">
- Shift
+ Maiusc
</string>
<string name="KBCtrl">
Ctrl
@@ -1112,13 +1200,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 +1215,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 +1227,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 +1242,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 +1284,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 +1319,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 +1345,7 @@ di questa texture in inventario.
Proprietà principale
</string>
<string name="IMMainland">
- mainland
+ continente
</string>
<string name="IMTeen">
teen
@@ -1266,20 +1354,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,13 +1528,19 @@ 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)
@@ -1302,18 +1549,16 @@ di questa texture in inventario.
(gruppo)
</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.
- </string>
- <string name="covenant_last_modified">
- Ultima modifica:
+ 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="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 +1569,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 +1633,7 @@ di questa texture in inventario.
Saldo
</string>
<string name="GroupMoneyCredits">
- Crediti
+ Ringraziamenti
</string>
<string name="GroupMoneyDebits">
Debiti
@@ -1391,32 +1645,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 +1688,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 +1715,7 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
Destra
</string>
<string name="Back">
- Dietro
+ Indietro
</string>
<string name="North">
Nord
@@ -1476,13 +1736,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 +1754,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 +1799,7 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
Residenziale
</string>
<string name="Stage">
- Stage
+ Fase
</string>
<string name="Other">
Altro
@@ -1551,10 +1811,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 +1822,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 +1851,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 +1859,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 +1869,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 +1888,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 +1907,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 +1932,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 +1953,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 +1999,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 +2014,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 +2029,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 +2050,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 +2071,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 +2080,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 +2104,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 +2149,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 +2194,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 +2202,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 +2226,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 +2251,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 +2260,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 +2335,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 +2353,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 +2377,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 +2422,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Forma del mento
</string>
<string name="Join">
- Avvicinati
+ Iscriviti
</string>
<string name="Jowls">
Guance
@@ -2297,7 +2452,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 +2494,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 +2530,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 +2542,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 +2553,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 +2578,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 +2587,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 +2596,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 +2671,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Posizione della bocca
</string>
<string name="Mowhawk">
- Vuoti
+ Moicana
</string>
<string name="Muscular">
Muscolatura
@@ -2563,9 +2715,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 +2746,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 +2772,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 +2818,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 +2833,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 +2851,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Pigmento
</string>
<string name="Pigtails">
- Ciuffi
+ Codini
</string>
<string name="Pink">
Rosa
@@ -2725,9 +2871,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 +2895,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 +2907,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 +2919,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 +2983,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 +3000,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 +3007,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 +3034,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 +3063,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 +3081,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 +3099,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 +3117,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 +3166,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 +3181,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 +3202,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 +3220,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 +3262,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 +3286,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 +3295,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 +3303,24 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="IM_moderator_label">
(Moderatore)
</string>
+ <string name="answered_call">
+ Risposto alla chiamata
+ </string>
+ <string name="started_call">
+ Chiamata vocale iniziata
+ </string>
+ <string name="joined_call">
+ Si è collegato alla chiamata in voce
+ </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 +3330,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 +3354,168 @@ 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="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="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>
</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 0eaad11cc7..d2765eb0c8 100644
--- a/indra/newview/skins/default/xui/ja/floater_about.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about.xml
@@ -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">
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 ceda48109e..2f5065c05f 100644
--- a/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -62,6 +62,9 @@
<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>
@@ -264,7 +267,7 @@
<text left="200" name="selected_objects_text">
[COUNT]
</text>
- <text name="Autoreturn" width="500">
+ <text name="Autoreturn">
他人ã®ã‚ªãƒ–ジェクトを自動返å´ï¼ˆåˆ†å˜ä½ã€0 ã§è‡ªå‹•è¿”å´ãªã—):
</text>
<line_editor left_delta="5" name="clean other time" right="-80"/>
@@ -308,36 +311,36 @@
(ãªã—)
</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="プッシュç¦æ­¢" 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"/>
@@ -355,7 +358,7 @@
<combo_box.item label="ãã®ä»–" name="item12"/>
</combo_box>
<combo_box name="land category">
- <combo_box.item label="全カテゴリー" name="item0"/>
+ <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"/>
@@ -379,7 +382,7 @@
<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"/>
@@ -395,7 +398,7 @@
<text name="at URL:">
ホームページ:
</text>
- <button label="設定" label_selected="設定..." name="set_media_url"/>
+ <button label="設定" name="set_media_url"/>
<check_box label="URL ã‚’éžè¡¨ç¤º" name="hide_media_url" tool_tip="ã“ã®ã‚ªãƒ—ションをオンã«ã™ã‚‹ã¨ã€è¨±å¯ãªã—ã§ã“ã®åŒºç”»æƒ…å ±ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„るユーザーã«ã¯ãƒ¡ãƒ‡ã‚£ã‚¢ URL ãŒè¡¨ç¤ºã•ã‚Œã¾ã›ã‚“。 ã“れ㯠HTML タイプã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ã®ã§ã”注æ„ãã ã•ã„。"/>
<text name="Description:">
説明:
@@ -442,6 +445,9 @@
<panel.string name="access_estate_defined">
(エステートã«é™å®šï¼‰
</panel.string>
+ <panel.string name="allow_public_access">
+ ãƒ‘ãƒ–ãƒªãƒƒã‚¯ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¨±å¯ ï¼ˆ[MATURITY])
+ </panel.string>
<panel.string name="estate_override">
1 ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションãŒã€ä¸å‹•ç”£ãƒ¬ãƒ™ãƒ«ã§è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚
</panel.string>
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 8c2ac17ace..548d24097f 100644
--- a/indra/newview/skins/default/xui/ja/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_animation_preview.xml
@@ -141,35 +141,35 @@
表ç¾
</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="アニメーションã®ãƒ–レンドアウト時間(秒)"/>
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 0ea913e66a..17ba39588e 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" width="100">
- ベークドテクスãƒãƒ£
- </text>
- <text name="composite_label" width="128">
- åˆæˆãƒ†ã‚¯ã‚¹ãƒãƒ£
- </text>
- <button label="テクスãƒãƒ£ID一覧をコンソールã«æ›¸ã込む" label_selected="æ¨ã¦ã‚‹" name="Dump" width="200"/>
<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_buy_currency.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
index 32de533dc4..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,7 +37,7 @@
見ç©ã‚‚り中...
</text>
<text name="buy_action">
- [NAME] L$ [PRICE]
+ [ACTION]
</text>
<text name="total_label">
購入後ã®æ®‹é«˜
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_day_cycle_options.xml b/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml
index 2a7985fe58..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" ?>
+<?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" />
+ <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" left_delta="70"/>
- <button label="åœæ­¢!" label_selected="åœæ­¢" name="WLStopAnimSky" />
- <button label="ä¸å‹•ç”£ã®æ™‚刻を使用"
- label_selected="ä¸å‹•ç”£ã®æ™‚刻ã«å¤‰æ›´" name="WLUseLindenTime" width="140"/>
- <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_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 6ccd6b9293..ffea9474b0 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" width="160"/>
<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="太陽ä½ç½®ã‚’固定([地域ï¼ä¸å‹•ç”£]>[地形]ã®å ´åˆã¨åŒæ§˜ï¼‰"/>
@@ -52,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_image_preview.xml b/indra/newview/skins/default/xui/ja/floater_image_preview.xml
index 2e57acf0d2..1ffc27fd70 100644
--- a/indra/newview/skins/default/xui/ja/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_image_preview.xml
@@ -10,16 +10,16 @@
プレビュー:
</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">
イメージを読ã¿å–ã‚Œã¾ã›ã‚“。
diff --git a/indra/newview/skins/default/xui/ja/floater_joystick.xml b/indra/newview/skins/default/xui/ja/floater_joystick.xml
index 65eeebe4ed..daa480ef5a 100644
--- a/indra/newview/skins/default/xui/ja/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/ja/floater_joystick.xml
@@ -89,7 +89,7 @@
<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_map.xml b/indra/newview/skins/default/xui/ja/floater_map.xml
index 8d920a3c3f..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" title="ミニマップ">
+<floater name="Map" title="">
<floater.string name="mini_map_north">
北
</floater.string>
diff --git a/indra/newview/skins/default/xui/ja/floater_moveview.xml b/indra/newview/skins/default/xui/ja/floater_moveview.xml
index 20aec48541..6a9d427830 100644
--- a/indra/newview/skins/default/xui/ja/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_moveview.xml
@@ -6,18 +6,48 @@
<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>
@@ -28,10 +58,12 @@
飛ã¶
</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>
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 4ccaf1a4af..f1a05e0eec 100644
--- a/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml
@@ -28,7 +28,7 @@
[VOICE_CHANNEL_NAME] ã¸ã®æŽ¥ç¶šãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ [RECONNECT_NEARBY]
</text>
<text name="nearby_P2P_by_other">
- [VOICE_CHANNEL_NAME] ãŒã‚³ãƒ¼ãƒ«ã‚’終了ã—ã¾ã—ãŸã€‚ [RECONNECT_NEARBY]
+ コールを切りã¾ã—ãŸã€‚ [RECONNECT_NEARBY]
</text>
<text name="nearby_P2P_by_agent">
コールを終了ã—ã¾ã—ãŸã€‚ [RECONNECT_NEARBY]
diff --git a/indra/newview/skins/default/xui/ja/floater_postcard.xml b/indra/newview/skins/default/xui/ja/floater_postcard.xml
index 5a2b047fe0..9d9b59fa51 100644
--- a/indra/newview/skins/default/xui/ja/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/ja/floater_postcard.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="スナップショットをメール">
+<floater name="Postcard" title="スナップショットをEメールã§é€ä¿¡">
<text name="to_label">
- ä½äººã®ãƒ¡ãƒ¼ãƒ«ï¼š
+ å—ä¿¡å…ˆã®Eメール:
</text>
<line_editor left="145" name="to_form" width="125"/>
<text name="from_label">
- ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ï¼š
+ ã‚ãªãŸã®Eメール:
</text>
<line_editor left="145" name="from_form" width="125"/>
<text name="name_label">
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_report_abuse.xml b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
index 105e903840..dc34441535 100644
--- a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
@@ -92,7 +92,7 @@
<text name="dscr_title">
詳細:
</text>
- <text name="bug_aviso" width="210">
+ <text name="bug_aviso">
ã§ãã‚‹ã ã‘具体的ã«è©³ã—ã記入ã—ã¦ãã ã•ã„。
</text>
<text name="incomplete_title">
diff --git a/indra/newview/skins/default/xui/ja/floater_snapshot.xml b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
index 153b4068ad..9aecbab70f 100644
--- a/indra/newview/skins/default/xui/ja/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
@@ -1,79 +1,16 @@
<?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>
- <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="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="カスタム" name="Custom"/>
- </combo_box>
- <combo_box label="解åƒåº¦" name="texture_size_combo">
- <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/>
- <combo_box.item label="å°ï¼ˆ128 x 128)" name="Small(128x128)"/>
- <combo_box.item label="中(256 x 256)" name="Medium(256x256)"/>
- <combo_box.item label="大(512 x5 12)" 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="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="カスタム" 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">
+<floater name="Snapshot" title="スナップショット">
+ <floater.string name="unknown">
ä¸æ˜Ž
- </string>
+ </floater.string>
+ <button label="スナップショットを更新" name="new_snapshot_btn"/>
+ <line_editor label="説明" name="description"/>
+ <button label="共有" name="share"/>
+ <button label="Web ã§å…±æœ‰" name="share_to_web"/>
+ <button label="「æŒã¡ç‰©ã€ã«ä¿å­˜" name="save_to_inventory"/>
+ <button label="ä¿å­˜" name="save"/>
+ <button label="スナップショットをメール" name="share_to_email"/>
+ <button label="コンピューターã«ä¿å­˜" name="save_to_computer"/>
+ <button label="プロフィールã«è¨­å®š" name="set_profile_pic"/>
+ <button label="戻る" name="cancel"/>
</floater>
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 6536eb253c..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,5 +1,5 @@
<?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">
会話
</string>
diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml
index a8261a7493..d095dee974 100644
--- a/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -49,7 +49,7 @@
</text>
<radio_group name="focus_radio_group">
<radio_item label="ズーム" name="radio zoom"/>
- <radio_item label="軌跡(Ctrl)" name="radio orbit"/>
+ <radio_item label="旋回(Ctrl)" name="radio orbit"/>
<radio_item label="水平・垂直移動 (Ctrl + Shift)" name="radio pan"/>
</radio_group>
<radio_group name="move_radio_group">
@@ -67,8 +67,11 @@
<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 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"/>
@@ -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="ãƒãƒ¥ãƒ¼ãƒ–"/>
@@ -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"/>
@@ -347,7 +350,7 @@
</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"/>
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_world_map.xml b/indra/newview/skins/default/xui/ja/floater_world_map.xml
index 0e489be9a8..ce9e7d0777 100644
--- a/indra/newview/skins/default/xui/ja/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/ja/floater_world_map.xml
@@ -23,7 +23,7 @@
土地販売
</text>
<text name="by_owner_label">
- 所有者ã«ã¦
+ 所有者ã®è²©å£²
</text>
<text name="auction_label">
土地オークション
@@ -68,7 +68,7 @@
<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="SLurl をコピー" name="copy_slurl" tool_tip="ç¾åœ¨åœ°ã® SLurl をコピーã—㦠Web ã§ä½¿ç”¨ã—ã¾ã™"/>
<button label="é¸æŠžã‚’表示ã™ã‚‹" label_selected="目的地を表示" name="Show Destination" tool_tip="é¸æŠžã—ãŸå ´æ‰€ã‚’地図ã®ä¸­å¿ƒã«è¡¨ç¤ºã—ã¾ã™"/>
</panel>
<panel name="layout_panel_5">
diff --git a/indra/newview/skins/default/xui/ja/inspect_avatar.xml b/indra/newview/skins/default/xui/ja/inspect_avatar.xml
index aeac0a8328..fb4937242b 100644
--- a/indra/newview/skins/default/xui/ja/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/ja/inspect_avatar.xml
@@ -20,7 +20,7 @@
<button label="IM" name="im_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/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 a638bed36f..83d3ec567e 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
@@ -20,8 +20,11 @@
<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="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..0e69671f06 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_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_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml
index 93f75f3ce1..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,7 +11,7 @@
<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"/>
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 d02701b400..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 1607b2647e..452d0567da 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml
@@ -1,5 +1,6 @@
<?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"/>
@@ -49,10 +50,11 @@
<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="Find Original"/>
<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="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"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml
index d6f13f0e59..e2a7f39dfd 100644
--- a/indra/newview/skins/default/xui/ja/menu_login.xml
+++ b/indra/newview/skins/default/xui/ja/menu_login.xml
@@ -8,18 +8,8 @@
<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"/>
@@ -28,5 +18,7 @@
<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_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_profile_overflow.xml b/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml
index d7107dc153..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,5 +1,6 @@
<?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"/>
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..7ebaa6e1c8
--- /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_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index bcad812457..f6695d2d13 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -7,7 +7,7 @@
</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_call label="アウトフィットを変更" name="ChangeOutfit"/>
<menu_item_check label="æŒã¡ç‰©" name="Inventory"/>
<menu_item_check label="æŒã¡ç‰©" name="ShowSidetrayInventory"/>
<menu_item_check label="ジェスãƒãƒ£ãƒ¼" name="Gestures"/>
@@ -31,6 +31,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>
@@ -66,17 +67,6 @@
<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"/>
@@ -124,6 +114,7 @@
<menu_item_call label="[APP_NAME] ã«ã¤ã„ã¦" name="About Second Life"/>
</menu>
<menu label="アドãƒãƒ³ã‚¹" name="Advanced">
+ <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"/>
@@ -145,7 +136,6 @@
<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>
<menu label="レンダリング(種類)" name="Rendering Types">
<menu_item_check label="シンプル" name="Simple"/>
@@ -173,6 +163,7 @@
<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 label="ショートカット" name="Shortcuts">
@@ -199,7 +190,6 @@
<menu_item_call label="ズームイン" name="Zoom In"/>
<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"/>
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index ddb2ae49f7..5d162eb80f 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -348,6 +348,9 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
</url>
<usetemplate name="okcancelbuttons" notext="ã‚‚ã†ä¸€åº¦è©¦ã™" yestext="æ–°ã—ã„アカウントを作æˆ"/>
</notification>
+ <notification name="InvalidCredentialFormat">
+ 「ユーザーåã€æ¬„ã«ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ•ã‚¡ãƒ¼ã‚¹ãƒˆãƒãƒ¼ãƒ ã¨ãƒ©ã‚¹ãƒˆãƒãƒ¼ãƒ ä¸¡æ–¹ã‚’入力ã—ã¦ã‹ã‚‰ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ãã ã•ã„。
+ </notification>
<notification name="AddClassified">
クラシファイド広告ã¯ã€æ¤œç´¢ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨ [http://secondlife.com/community/classifieds secondlife.com] ã®ã€Œã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ä¸€é€±é–“掲載ã•ã‚Œã¾ã™ã€‚
広告を記入ã—ãŸã‚‰ã€ã€ŒæŽ²è¼‰...ã€ã‚’クリックã—ã¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«è¿½åŠ ã—ã¦ãã ã•ã„。
@@ -374,7 +377,7 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
<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">
@@ -635,6 +638,11 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
<notification name="CannotEncodeFile">
次ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ãŒã§ãã¾ã›ã‚“: [FILE]
</notification>
+ <notification name="CorruptedProtectedDataStore">
+ ã‚ãªãŸã®ä¿è­·ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã‚’読ã¿ã¨ã‚‹ã“ã¨ãŒå‡ºæ¥ãªã„ãŸã‚リセットã•ã‚Œã¾ã™ã€‚
+ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¨­å®šã‚’変更ã™ã‚‹ã¨èµ·ã“ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CorruptResourceFile">
ç ´æã—ãŸãƒªã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ï¼š [FILE]
</notification>
@@ -958,6 +966,16 @@ L$ ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。
<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 name="RemoveFromFriends">
[FIRST_NAME] [LAST_NAME] をフレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
@@ -990,6 +1008,12 @@ L$ ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。
金é¡ã‚’増やã—ã¦ãã ã•ã„。
</notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ ã“ã“ã«ãƒªãƒ³ã‚¯ã•ã‚ŒãŸã‚¢ã‚¤ãƒ†ãƒ ãŒå°‘ãªãã¨ã‚‚1ã¤ã‚ã‚Šã¾ã™ã€‚ ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã™ã‚‹ã¨ã“ã“ã«ãƒªãƒ³ã‚¯ã•ã‚ŒãŸã‚‚ã®ãŒæ©Ÿèƒ½ã—ãªããªã‚Šã¾ã™ã€‚ リンクを先ã«å‰Šé™¤ã™ã‚‹ã“ã¨ã‚’å¼·ããŠå‹§ã‚ã—ã¾ã™ã€‚
+
+ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
<notification name="ConfirmObjectDeleteLock">
é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®ã†ã¡ã€å°‘ãªãã¨ã‚‚ 1 ã¤ãŒãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚
@@ -1147,6 +1171,42 @@ 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>
@@ -1456,6 +1516,10 @@ F1 キーを押ã—ã¦ãã ã•ã„。
[CLASSIFIED] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
<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">
@@ -1538,15 +1602,18 @@ F1 キーを押ã—ã¦ãã ã•ã„。
ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
</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="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚Œãªã„ã¨ã"/>
</form>
</notification>
+ <notification name="PreferredMaturityChanged">
+ ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨­å®šã¯ç¾åœ¨ [RATING] ã§ã™ã€‚
+ </notification>
<notification name="LandClaimAccessBlocked">
ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
@@ -1970,6 +2037,9 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
<notification name="SystemMessageTip">
[MESSAGE]
</notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
<notification name="Cancelled">
å–り消ã•ã‚Œã¾ã—ãŸã€‚
</notification>
@@ -1998,6 +2068,11 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
インワールド㨠Web サイトã®ã‚¹ãƒŠãƒƒãƒ—ショットをアップロード中ã§ã™...
(所è¦æ™‚間:約 5 分)
</notification>
+ <notification name="UploadConfirmation">
+ アップロード料金㯠L$[AMOUNT] ã§ã™ã€‚
+続ã‘ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="アップロード"/>
+ </notification>
<notification name="UploadPayment">
アップロード㫠L$ [AMOUNT] 支払ã„ã¾ã—ãŸã€‚
</notification>
@@ -2205,7 +2280,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
ã“ã“ã§ã¯é£›ã¹ã¾ã›ã‚“。
</notification>
<notification name="PushRestricted">
- ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒ—ッシュãŒåˆ¶é™ã•ã‚Œã¦ã„ã¾ã™ã€‚ 土地所有者以外ã¯ä»–人をプッシュã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒ—ッシュãŒç¦æ­¢ã•ã‚Œã¦ã„ã¾ã™ã€‚ 土地所有者以外ã¯ä»–人をプッシュã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="NoVoice">
ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆãŒç„¡åŠ¹ã§ã™ã€‚ 誰ã‹ãŒè©±ã—ã¦ã„ã‚‹ã®ã‚’èžãã“ã¨ã¯ã§ãã¾ã›ã‚“。
@@ -2314,15 +2389,6 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
<button name="Mute" text="ブロック"/>
</form>
</notification>
- <notification name="ObjectGiveItemUnknownUser">
- (ä¸æ˜Žã®ä½äººï¼‰ãŒæ‰€æœ‰ã™ã‚‹ [OBJECTFROMNAME] ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã« [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š
-[ITEM_SLURL]
- <form name="form">
- <button name="Keep" text="å—ã‘å–ã‚‹"/>
- <button name="Discard" text="破棄"/>
- <button name="Mute" text="ブロック"/>
- </form>
- </notification>
<notification name="UserGiveItem">
[NAME_SLURL] ãŒã‚ãªãŸã« [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š
[ITEM_SLURL]
@@ -2346,9 +2412,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="å–り消ã—"/>
@@ -2366,12 +2432,11 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
</form>
</notification>
<notification name="OfferFriendship">
- [NAME]ã¯ã€
-フレンド登録を申ã—込んã§ã„ã¾ã™ã€‚
+ [NAME_SLURL] ã¯ãƒ•ãƒ¬ãƒ³ãƒ‰ç™»éŒ²ã‚’申ã—込んã§ã„ã¾ã™ã€‚
[MESSAGE]
-(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚)
+(デフォルト設定ã ã¨ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’見るã“ã¨ãŒã§ãã¾ã™ï¼‰
<form name="form">
<button name="Accept" text="å—ã‘入れる"/>
<button name="Decline" text="辞退"/>
@@ -2435,6 +2500,9 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
<notification name="FailedToFindWearable">
データベース㫠[DESC] ã¨ã„ã†åå‰ã® [TYPE] ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
</notification>
+ <notification name="ShareToWebFailed">
+ Web サイトã¸ã®ç”»åƒã®ã‚¢ãƒƒãƒ—ロードã«å¤±æ•—ã—ã¾ã—ãŸã€‚
+ </notification>
<notification name="InvalidWearable">
ç€ç”¨ã—よã†ã¨ã—ã¦ã„るアイテムã¯ã‚ãªãŸã®ãƒ“ューワã§ã¯èª­ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 [APP_NAME] ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’アップグレードã—ã¦ã‹ã‚‰ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ç€ç”¨ã—ã¦ãã ã•ã„。
</notification>
@@ -2476,14 +2544,6 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
<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">
ãŠæ”¯æ‰•ã‚ã‚ŠãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚
@@ -2639,6 +2699,56 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
é¸æŠžã—ãŸãƒœã‚¿ãƒ³ã‚’ç¾åœ¨è¡¨ç¤ºã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
ã˜ã‚…ã†ã¶ã‚“ãªã‚¹ãƒšãƒ¼ã‚¹ãŒã§ãã‚Œã°ãƒœã‚¿ãƒ³ã¯è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚
</notification>
+ <notification name="ShareNotification">
+ ä½äººé¸æŠžç”»é¢ã«è¡¨ç¤ºã•ã‚ŒãŸäººã«ã€ŒæŒã¡ç‰©ã€ã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ ã‚’ドラッグã—ã¦ãã ã•ã„
+ </notification>
+ <notification name="DeedToGroupFail">
+ グループã¸ã®è­²æ¸¡ã«å¤±æ•—ã—ã¾ã—ãŸã€‚
+ </notification>
+ <notification name="AvatarRezNotification">
+ ( [EXISTENCE] 秒)
+ã‚¢ãƒã‚¿ãƒ¼ã€Œ [NAME] ã€ãŒ [TIME] 秒ã§å‡ºç¾ã—ã¾ã™ã€‚
+ </notification>
+ <notification name="AvatarRezSelfNotification">
+ ( [EXISTENCE] 秒)
+[TIME] 秒ã§ã‚¢ã‚¦ãƒˆãƒ•ã‚£ãƒƒãƒˆã®ãƒ™ãƒ¼ã‚­ãƒ³ã‚°ãŒå®Œäº†ã—ã¾ã—ãŸã€‚
+ </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="AvatarRezLeftNotification">
+ ( [EXISTENCE] 秒)
+ã‚¢ãƒã‚¿ãƒ¼ã€Œ NAME ã€ãŒå®Œå…¨ã«èª­ã¿è¾¼ã¾ã‚Œã¾ã—ãŸã€‚
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ ã“ã®ã‚³ãƒ¼ãƒ«ã‹ã‚‰æŠœã‘ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="コールã‹ã‚‰æŠœã‘ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ グループコールã®å‚加者全員をミュートã—ã¾ã—ãŸã€‚
+ã‚ã¨ã‹ã‚‰ã“ã®ã‚³ãƒ¼ãƒ«ã«å‚加ã™ã‚‹ä½äººã‚‚
+ミュートã•ã‚Œã¾ã™ã€‚ã‚ãªãŸãŒã‚³ãƒ¼ãƒ«ã‚’終了ã—ã¦ã‚‚ä»–ã®å‚加者ã®ãƒŸãƒ¥ãƒ¼ãƒˆçŠ¶æ…‹ãŒç¶šãã¾ã™ã€‚
+
+全員をミュートã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="グループコールã®å‚加者全員をミュートã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="Ok" yestext="キャンセル"/>
+ </notification>
<global name="UnsupportedCPU">
- ã‚ãªãŸã® CPU ã®é€Ÿåº¦ã¯å¿…須動作環境ã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
</global>
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..517fdeb25e
--- /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 f12f07f3e9..04b4893026 100644
--- a/indra/newview/skins/default/xui/ja/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/ja/panel_bottomtray.xml
@@ -1,11 +1,7 @@
<?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">
@@ -24,6 +20,21 @@
<layout_panel name="snapshot_panel">
<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="会話"/>
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..834884fa4a
--- /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_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_shape.xml b/indra/newview/skins/default/xui/ja/panel_edit_shape.xml
index 1e20eb26b6..5aed830d80 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,19 @@
<?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>
+ <text name="avatar_height">
+ 高㕠[HEIGHT] メートル
+ </text>
+ <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 78ddae47f9..c3f8c12620 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml
@@ -4,5 +4,6 @@
<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..5e3342699b 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
@@ -93,6 +93,17 @@
<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 label="gear_buttom_panel" name="gear_buttom_panel">
+ <button name="friends_viewsort_btn" tool_tip="オプション"/>
+ <button name="add_btn" tool_tip="TODO"/>
+ <button name="del_btn" tool_tip="TODO"/>
</panel>
<panel name="button_panel">
<button label="別åã§ä¿å­˜" name="save_as_button"/>
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 1b89b1b3cc..bfe69cbdd9 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_general.xml
@@ -47,8 +47,11 @@
<check_box label="入会費ãŒã‹ã‹ã‚Šã¾ã™" name="check_enrollment_fee" tool_tip="入会費ãŒå¿…è¦ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™ã€‚"/>
<spinner label="L$" name="spin_enrollment_fee" tool_tip="「入会費ã€ã«ãƒã‚§ãƒƒã‚¯ãŒå…¥ã£ã¦ã„ã‚‹å ´åˆã€æ–°è¦ãƒ¡ãƒ³ãƒãƒ¼ã¯æŒ‡å®šã•ã‚ŒãŸå…¥ä¼šè²»ã‚’支払ã‚ãªã‘ã‚Œã°ã‚°ãƒ«ãƒ¼ãƒ—ã«å…¥ã‚Œã¾ã›ã‚“。"/>
<combo_box name="group_mature_check" tool_tip="ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã€ŒModerateã€ã«ãƒ¬ãƒ¼ãƒˆè¨­å®šã•ã‚ŒãŸæƒ…å ±ãŒã‚ã‚‹ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™">
- <combo_box.item label="「Generalã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„" name="pg"/>
+ <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>
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 c0449f1221..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
@@ -6,6 +6,9 @@
<panel.string name="cant_view_group_land_text">
グループ所有地を確èªã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。
</panel.string>
+ <panel.string name="epmty_view_group_land_text">
+ ãªã—
+ </panel.string>
<panel.string name="cant_view_group_accounting_text">
グループã®ä¼šè¨ˆæƒ…報を確èªã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。
</panel.string>
@@ -45,7 +48,7 @@
ã‚ãªãŸã®è²¢çŒ®ï¼š
</text>
<text name="your_contribution_units">
- 平方メートル
+ m²
</text>
<text name="your_contribution_max_value">
(最大 [AMOUNT])
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 a0c50c6122..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,7 +15,7 @@
<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">
@@ -25,7 +25,7 @@
<button label="æ›´æ–°" label_selected="リスト更新" name="refresh_notices" tool_tip="通知リストを更新ã—ã¾ã™"/>
<panel label="æ–°ã—ã„通知を作æˆ" name="panel_create_new_notice">
<text name="lbl">
- 通知を作æˆ
+ 通知ã®ä½œæˆ
</text>
<text name="lbl3">
件å:
@@ -39,6 +39,7 @@
<text name="string">
ã“ã“ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ドラッグ&ドロップã—ã¦æ·»ä»˜ã—ã¦ãã ã•ã„:
</text>
+ <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="æŒã¡ç‰©ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã“ã®ãƒœãƒƒã‚¯ã‚¹ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€é€šçŸ¥ã¨ä¸€ç·’ã«é€ã‚Šã¾ã™ã€‚ 添付ã™ã‚‹ã«ã¯ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ”ーã¨å†è²©ãƒ»ãƒ—レゼントã®æ¨©é™ãŒã‚ãªãŸã«ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"/>
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 db6fe268c7..8a629be910 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_roles.xml
@@ -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_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_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml
index c217af38ba..f0ebc67ef5 100644
--- a/indra/newview/skins/default/xui/ja/panel_login.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login.xml
@@ -8,18 +8,15 @@
</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"/>
+ <button label="ログイン" left_pad="30" name="connect_btn" width="60"/>
<text name="start_location_text">
開始地点:
</text>
@@ -28,7 +25,6 @@
<combo_box.item label="ホーム" name="MyHome"/>
<combo_box.item label="<地域åを入力>" name="Typeregionname"/>
</combo_box>
- <button label="ログイン" left_pad="30" name="connect_btn" width="60"/>
</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 36c7b75f97..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_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_nearby_media.xml b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
index a670975dda..d0e423bd18 100644
--- a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
@@ -1,5 +1,8 @@
<?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>
@@ -16,13 +19,15 @@
<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_less_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"/>
@@ -49,7 +54,7 @@
<button name="mute_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã®éŸ³ã‚’ミュート"/>
</layout_panel>
<layout_panel name="zoom">
- <button name="zoom_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã«è¿‘ã¥ã"/>
+ <button name="zoom_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã«ã‚ºãƒ¼ãƒ "/>
</layout_panel>
<layout_panel name="unzoom">
<button name="unzoom_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‹ã‚‰é ã–ã‹ã‚‹"/>
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..cf6e6eaae3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml
@@ -0,0 +1,45 @@
+<?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="オブジェクト"/>
+ <button label="編集" name="edit_wearable_btn"/>
+ <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">
+ <panel label="bottom_panel" name="edit_panel"/>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel">
+ <text name="add_to_outfit_label" value="アウトフィットã«è¿½åŠ ï¼š"/>
+ <layout_stack name="filter_panels">
+ <layout_panel label="IM コントロールパãƒãƒ«" name="filter_panel">
+ <filter_editor label="フィルター" 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="ä¿å­˜" 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 b941763388..14f0d7d5e0 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="ã‚‚ã®" name="Outfits">
<tab_container name="appearance_tabs">
- <inventory_panel label="マイ アウトフィット" name="outfitslist_tab"/>
+ <panel label="マイ アウトフィット" name="outfitslist_tab"/>
<inventory_panel label="ç€ç”¨ä¸­" name="cof_tab"/>
</tab_container>
<panel name="bottom_panel">
@@ -9,6 +9,6 @@
<dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã—ã¾ã™"/>
<button label="アウトフィットをä¿å­˜ã™ã‚‹" name="make_outfit_btn" tool_tip="容姿をアウトフィットã«ä¿å­˜ã—ã¾ã™" width="140"/>
<button label="装ç€" name="wear_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¦ãƒˆãƒ•ã‚£ãƒƒãƒˆã‚’ç€ç”¨ã—ã¾ã™"/>
- <button label="M" name="look_edit_btn"/>
+ <button label="アウトフットã®ç·¨é›†" name="edit_current_outfit_btn"/>
</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 488a8c7a9b..68af19910a 100644
--- a/indra/newview/skins/default/xui/ja/panel_people.xml
+++ b/indra/newview/skins/default/xui/ja/panel_people.xml
@@ -1,14 +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_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 検索ã§ã‚°ãƒ«ãƒ¼ãƒ—を探ã—ã¦ã¿ã¾ã™ã‹ï¼Ÿ]"/>
- <string name="no_groups_msg" value="[secondlife:///app/search/groups 入会ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—を探ã—ã¾ã™ã€‚]"/>
+ <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">
@@ -27,10 +36,6 @@
<button name="add_btn" tool_tip="フレンド登録を申ã—出ã¾ã™"/>
<button name="del_btn" tool_tip="é¸æŠžã—ãŸäººã‚’フレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™"/>
</panel>
- <text name="no_friends_msg">
- フレンドを登録ã™ã‚‹ã«ã¯ã€[secondlife:///app/search/people グローãƒãƒ«æ¤œç´¢] ã‚’ã™ã‚‹ã‹ã€ä½äººã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。
-誰ã‹ä¸€ç·’ã«è¡Œå‹•ã‚’ã™ã‚‹äººã‚’ãŠæŽ¢ã—ã®æ™‚ã¯ã€[secondlife:///app/worldmap 地図をãŠè©¦ã—ã ã•ã„]。
- </text>
</panel>
<panel label="マイ グループ" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
@@ -50,7 +55,7 @@
<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="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="ãƒãƒ£ãƒƒãƒˆã‚’開始ã—ã¾ã™"/>
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 433ed0ad93..9de04f0d6a 100644
--- a/indra/newview/skins/default/xui/ja/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
@@ -69,7 +69,7 @@
<accordion name="advanced_info_accordion">
<accordion_tab name="parcel_characteristics_tab" title="区画">
<panel name="parcel_characteristics_panel">
- <text name="rating_label" value="レーティング区分:"/>
+ <text name="rating_label" value="レーティング:"/>
<text name="rating_value" value="ä¸æ˜Ž"/>
<text name="voice_label" value="ボイス:"/>
<text name="voice_value" value="オン"/>
@@ -88,11 +88,11 @@
</accordion_tab>
<accordion_tab name="region_information_tab" title="リージョン(地域) ">
<panel name="region_information_panel">
- <text name="region_name_label" value="リージョン(地域):"/>
+ <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_label" value="レーティング:"/>
<text name="region_rating" value="Adult"/>
<text name="region_owner_label" value="所有者:"/>
<text name="region_owner" value="moose Van Moose"/>
@@ -105,8 +105,8 @@
</accordion_tab>
<accordion_tab name="estate_information_tab" title="エステート(ä¸å‹•ç”£ï¼‰">
<panel name="estate_information_panel">
- <text name="estate_name_label" value="エステート(ä¸å‹•ç”£ï¼‰ï¼š"/>
- <text name="estate_rating_label" value="レーティング区分:"/>
+ <text name="estate_name_label" value="エステート:"/>
+ <text name="estate_rating_label" value="レーティング:"/>
<text name="estate_owner_label" value="所有者:"/>
<text name="covenant_label" value="約款:"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_places.xml b/indra/newview/skins/default/xui/ja/panel_places.xml
index a7fbc79884..d78a56aa10 100644
--- a/indra/newview/skins/default/xui/ja/panel_places.xml
+++ b/indra/newview/skins/default/xui/ja/panel_places.xml
@@ -2,7 +2,7 @@
<panel label="場所" name="places panel">
<string name="landmarks_tab_title" value="マイ ランドマーク"/>
<string name="teleport_history_tab_title" value="テレãƒãƒ¼ãƒˆã®å±¥æ­´"/>
- <filter_editor label="ç§ã®å ´æ‰€ã‚’フィルターã™ã‚‹" name="Filter"/>
+ <filter_editor label="場所をフィルター" name="Filter"/>
<panel name="button_panel">
<button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="該当ã™ã‚‹ã‚¨ãƒªã‚¢ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
<button label="地図" name="map_btn"/>
@@ -11,5 +11,6 @@
<button label="ä¿å­˜" name="save_btn"/>
<button label="キャンセル" name="cancel_btn"/>
<button label="é–‰ã˜ã‚‹" name="close_btn"/>
+ <button label="プロフィール" name="profile_btn"/>
</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 87cd772143..94ee5c6ff4 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
@@ -3,6 +3,9 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
+ <panel.string name="middle_mouse">
+ マウスã®ä¸­å¤®
+ </panel.string>
<slider label="視界角" name="camera_fov"/>
<slider label="è·é›¢" name="camera_offset_scale"/>
<text name="heading2">
@@ -10,6 +13,7 @@
</text>
<check_box label="制作・編集" name="edit_camera_movement" tool_tip="編集モードã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•ã®åˆ‡ã‚Šæ›¿ãˆã«ã€è‡ªå‹•ã‚«ãƒ¡ãƒ©ãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
<check_box label="容姿" name="appearance_camera_movement" tool_tip="編集モードã«å…¥ã£ãŸã¨ãã«ã€è‡ªå‹•ã‚«ãƒ¡ãƒ©ãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
+ <check_box initial_value="1" 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"/>
@@ -17,6 +21,9 @@
<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"/>
@@ -26,4 +33,5 @@
<line_editor label="プッシュ・トゥ・スピークã®ãƒˆãƒªã‚¬ãƒ¼" name="modifier_combo"/>
<button label="キー設定" name="set_voice_hotkey_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_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
index a521556c79..86f880de09 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
@@ -45,7 +45,13 @@
</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"/>
+ <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"/>
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 6df59ca189..4ccb70b321 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
@@ -44,7 +44,7 @@
<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">
@@ -53,12 +53,12 @@
<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 8df829c296..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>
@@ -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_setup.xml b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
index ad8c8437be..653d9fd3b3 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
@@ -34,9 +34,12 @@
Web:
</text>
<radio_group name="use_external_browser">
- <radio_item label="内蔵ブラウザを使用" name="internal" tool_tip="内蔵ブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„ Web リンクãªã©ã‚’見ã¾ã™ã€‚[APP_NAME] 内ã«æ–°ã—ã„ウィンドウã§ã“ã®ãƒ–ラウザãŒé–‹ãã¾ã™ã€‚" value="0"/>
<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="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">
プロキシ:
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 fe830d864f..abbd29286b 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
@@ -12,7 +12,7 @@
<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"/>
+ <check_box label="ä»–ã®ã‚¢ãƒã‚¿ãƒ¼ã«å–り付ã‘られãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’å†ç”Ÿã™ã‚‹" name="media_show_on_others_btn" tool_tip="ã“ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨ã€è¿‘ãã«ã„ã‚‹ä»–ã®ã‚¢ãƒã‚¿ãƒ¼ã«å–り付ã‘られãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’éžè¡¨ç¤ºã«ã—ã¾ã™" value="true"/>
<text name="voice_chat_settings">
ボイスãƒãƒ£ãƒƒãƒˆã®è¨­å®š
</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_region_estate.xml b/indra/newview/skins/default/xui/ja/panel_region_estate.xml
index 3113a68505..5b2ef36045 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_estate.xml
@@ -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">
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 923455abba..8a848f496d 100644
--- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
@@ -22,7 +22,7 @@
L$ [AMT]
</panel.string>
<button label="" label_selected="" name="buycurrency" tool_tip="所æŒé‡‘"/>
- <button label="購入" name="buyL" tool_tip="クリックã—㦠L$ を購入ã—ã¾ã™"/>
+ <button label="L$ ã®è³¼å…¥" name="buyL" tool_tip="クリックã—㦠L$ を購入ã—ã¾ã™"/>
<text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋)">
24:00 AM PST
</text>
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/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..a0f44d9de9 100644
--- a/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml
@@ -3,6 +3,8 @@
<panel label="" name="sidepanel__inventory_panel">
<panel name="button_panel">
<button label="プロフィール" name="info_btn"/>
+ <button label="共有" name="share_btn"/>
+ <button label="ショッピング" name="shop_btn"/>
<button label="装ç€" name="wear_btn"/>
<button label="プレイ" name="play_btn"/>
<button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 688e4751de..c0bb14afba 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">
明るã•å…¨é–‹ï¼ˆãƒ¬ã‚¬ã‚·ãƒ¼ï¼‰
@@ -85,9 +100,30 @@
<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,6 +133,24 @@
<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>
@@ -151,6 +205,24 @@
<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>
@@ -176,18 +248,40 @@
クリックã—㦠secondlife:// コマンドを出ã—ã¾ã™
</string>
<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>
@@ -230,6 +324,9 @@
<string name="GroupNameNone">
(ãªã—)
</string>
+ <string name="AvalineCaller">
+ Avaline コール [ORDER]
+ </string>
<string name="AssetErrorNone">
エラーãªã—
</string>
@@ -335,6 +432,9 @@
<string name="symbolic link">
リンク
</string>
+ <string name="symbolic folder link">
+ フォルダã®ãƒªãƒ³ã‚¯
+ </string>
<string name="AvatarEditingAppearance">
(容姿ã®ç·¨é›†ä¸­ï¼‰
</string>
@@ -758,6 +858,42 @@
<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>
@@ -810,7 +946,7 @@
左脚
</string>
<string name="BodyPartsTorso">
- é ­
+ 上åŠèº«
</string>
<string name="BodyPartsRightLeg">
å³è„š
@@ -828,10 +964,13 @@
ESC キーを押ã—ã¦ãƒ¯ãƒ¼ãƒ«ãƒ‰ãƒ“ューã«æˆ»ã‚Šã¾ã™
</string>
<string name="InventoryNoMatchingItems">
- 一致ã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ãŒæŒã¡ç‰©ã«ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ [secondlife:///app/search/groups 「検索ã€] ã‚’ãŠè©¦ã—ãã ã•ã„。
+ ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/all/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="PlacesNoMatchingItems">
+ ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/places/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。
</string>
<string name="FavoritesNoMatchingItems">
- ã“ã“ã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’ドラッグã—ã¦ã€ãŠæ°—ã«å…¥ã‚Šã«è¿½åŠ ã—ã¾ã™ã€‚
+ ã“ã“ã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’ドラッグã—ã¦ãŠæ°—ã«å…¥ã‚Šã«è¿½åŠ ã—ã¾ã™ã€‚
</string>
<string name="InventoryNoTexture">
「æŒã¡ç‰©ã€å†…ã«ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚³ãƒ”ーãŒã‚ã‚Šã¾ã›ã‚“
@@ -849,6 +988,7 @@
コンテンツãªã—
</string>
<string name="WornOnAttachmentPoint" value=" ([ATTACHMENT_POINT] ã«è£…ç€ä¸­ï¼‰"/>
+ <string name="ActiveGesture" value="[GESLABEL] (アクティブ)"/>
<string name="PermYes">
ã¯ã„
</string>
@@ -863,6 +1003,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="衣類ã€"/>
@@ -948,6 +1089,9 @@
<string name="InvFolder My Outfits">
マイ アウトフィット
</string>
+ <string name="InvFolder Accessories">
+ アクセサリ
+ </string>
<string name="InvFolder Friends">
フレンド
</string>
@@ -1301,7 +1445,7 @@
許å¯ã•ã‚ŒãŸä½äººï¼š ([ALLOWEDAGENTS] 人ã€æœ€å¤§ [MAXACCESS] 人)
</string>
<string name="RegionInfoAllowedGroups">
- 許å¯ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—: ([ALLOWEDGROUPS]ã€æœ€å¤§ [MAXACCESS] グループ)
+ 許å¯ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—: ([ALLOWEDGROUPS]ã€æœ€å¤§ [MAXACCESS] )
</string>
<string name="ScriptLimitsParcelScriptMemory">
区画スクリプトメモリ
@@ -1471,6 +1615,9 @@
<string name="PanelContentsNewScript">
æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト
</string>
+ <string name="PanelContentsTooltip">
+ オブジェクトã®ä¸­èº«
+ </string>
<string name="BusyModeResponseDefault">
メッセージをé€ã£ãŸä½äººã¯ã€èª°ã«ã‚‚邪魔をã•ã‚ŒãŸããªã„ãŸã‚ç¾åœ¨ã€Œå–ã‚Šè¾¼ã¿ä¸­ã€ãƒ¢ãƒ¼ãƒ‰ã§ã™ã€‚ ã‚ãªãŸã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ã‚ã¨ã§ç¢ºèªã§ãるよã†ã« IM パãƒãƒ«ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚
</string>
@@ -1486,15 +1633,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">
@@ -1543,25 +1691,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">
ãŒã‚¤ãƒ™ãƒ³ãƒˆç”¨ã®è²»ç”¨ã‚’支払ã„ã¾ã—ãŸ
@@ -1588,7 +1736,10 @@
キャンセル
</string>
<string name="UploadingCosts">
- %s ã®ã‚¢ãƒƒãƒ—ロード代金:
+ [NAME] ã®ã‚¢ãƒƒãƒ—ロード料金㯠L$[AMOUNT] ã§ã™
+ </string>
+ <string name="BuyingCosts">
+ ã“れを L$[AMOUNT] ã§è³¼å…¥ã—ã¾ã™
</string>
<string name="UnknownFileExtension">
ä¸æ˜Žã®æ‹¡å¼µå­ï¼š %s
@@ -2326,7 +2477,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
é ­ã®å¤§ãã•
</string>
<string name="Head Stretch">
- é ­ã®ä¼¸ã³
+ 縦横ã®é•·ã•
</string>
<string name="Heel Height">
ヒールã®é«˜ã•
@@ -3154,7 +3305,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
ã»ãŠã®ä¸Šéƒ¨
</string>
<string name="Upper Chin Cleft">
- ã‚ã”上部ã®å‰²ã‚Œå…·åˆ
+ ã‚ã”上部ã®å‰²ã‚Œ
</string>
<string name="Upper Eyelid Fold">
二é‡ã®å¹…
@@ -3225,6 +3376,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>
@@ -3255,6 +3415,12 @@ 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>
@@ -3282,12 +3448,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>
@@ -3375,4 +3547,219 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="unread_chat_multiple">
[SOURCES] ã¯ä½•ã‹æ–°ã—ã„ã“ã¨ã‚’言ã„ã¾ã—ãŸã€‚
</string>
+ <string name="session_initialization_timed_out_error">
+ セッションã®åˆæœŸåŒ–ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸ
+ </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">
+ 女性 - Get lost
+ </string>
+ <string name="FeMale - Blow kiss">
+ 女性 - 投ã’キッス
+ </string>
+ <string name="FeMale - Boo">
+ 女性 - 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>
</strings>
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 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..e4908deb07 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" width="338">
+ 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" width="338">
+ 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 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 815c36606c..9399fa1115 100644
--- a/indra/newview/skins/default/xui/pl/floater_auction.xml
+++ b/indra/newview/skins/default/xui/pl/floater_auction.xml
@@ -1,11 +1,11 @@
<?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ż.
+ 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="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 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 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 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 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 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 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..3d01129d9b 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,133 @@
<?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>
+ <floater.string name="icon_PG" value="Parcel_PG_Dark"/>
+ <floater.string name="icon_M" value="Parcel_M_Dark"/>
+ <floater.string name="icon_R" value="Parcel_R_Dark"/>
<text name="region_name_label">
Region:
</text>
@@ -74,9 +202,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 +226,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 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 95d82a3f9c..aec75f026f 100644
--- a/indra/newview/skins/default/xui/pl/floater_camera.xml
+++ b/indra/newview/skins/default/xui/pl/floater_camera.xml
@@ -9,6 +9,18 @@
<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 górę, w dół, w lewo i w prawo"/>
<panel name="zoom" tool_tip="Najedź kamerą w kierunku obiektu">
@@ -16,16 +28,16 @@
</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="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"/>
+ <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="Widok Awatara"/>
- <button label="" name="freecamera_btn" tool_tip="PodglÄ…d Obiektu"/>
+ <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 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 7bbdc35f94..a607ca982f 100644
--- a/indra/newview/skins/default/xui/pl/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/pl/floater_color_picker.xml
@@ -21,11 +21,11 @@
<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"/>
+ <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 by zapisać)
+ (Przeciągnij tutaj aby zapisać)
</text>
</floater>
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 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 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 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 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 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 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 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_im.xml b/indra/newview/skins/default/xui/pl/floater_im.xml
index 67c9d13496..e40935ccb7 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
index f4dd7d00e1..db513f787c 100644
--- a/indra/newview/skins/default/xui/pl/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/pl/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="Panel Kontroli Wiadomości Prywatnej (IM)" name="panel_im_control_panel"/>
+ <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>
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 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 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 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 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 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 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 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 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_lsl_guide.xml b/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml
index 5601aa4464..7b1b395f87 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 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 87d74f6c15..9ce99692d0 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="STYMULACJA WYCIEKU PAMIĘCI">
- <spinner label="Prędkość Przecieków (byty na klatkę):" name="leak_speed"/>
- <spinner label="Max Przecieki (MB):" name="max_leak"/>
+ <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>
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 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 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_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 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 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 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 1b0dd6113e..2128cfa3c8 100644
--- a/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml
@@ -5,7 +5,7 @@
<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 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 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 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 2a49864e93..6ce6914771 100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Opis:
</text>
- <button label="Używaj w Świecie" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Uruchom tę 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 tę animację widoczną tylko przez Ciebie" width="125"/>
+ <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_event.xml b/indra/newview/skins/default/xui/pl/floater_preview_event.xml
index 9fc0ff4da6..5d9e47bc00 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 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 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 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 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 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 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_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 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 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 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 cf0abb2c23..190ad61352 100644
--- a/indra/newview/skins/default/xui/pl/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/pl/floater_select_key.xml
@@ -2,6 +2,6 @@
<floater name="modal container" title="">
<button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
<text name="Save item as:">
- Naciśnij by uruchomić przycisk mówienia.
+ 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 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 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 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 c66ac0a98f..ac041dff6a 100644
--- a/indra/newview/skins/default/xui/pl/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_sound_preview.xml
@@ -7,5 +7,5 @@
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="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 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 011dc8ee7c..52c0cb8a93 100644
--- a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
@@ -4,7 +4,7 @@
Kliknij by wybrać obraz
</string>
<text name="Multiple">
- Wiele Tekstur
+ Wiele tekstur
</text>
<text name="unknown">
Rozmiar: [DIMENSIONS]
@@ -12,12 +12,12 @@
<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="Filtruj Tektury" name="inventory search editor"/>
+ <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="Ok" label_selected="Ok" 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 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 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 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_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 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 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 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..95010e0b91 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 initial_value="prawda" 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
index 4ba36de6fa..3ee0b976eb 100644
--- a/indra/newview/skins/default/xui/pl/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/pl/inspect_avatar.xml
@@ -13,9 +13,9 @@
<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="Więcej" name="view_profile_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"/>
+ <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
index d434443794..0a2a62ce74 100644
--- a/indra/newview/skins/default/xui/pl/inspect_group.xml
+++ b/indra/newview/skins/default/xui/pl/inspect_group.xml
@@ -5,10 +5,10 @@
-->
<floater name="inspect_group">
<string name="PrivateGroup">
- Grupa Prywatna
+ Grupa prywatna
</string>
<string name="FreeToJoin">
- Wstęp Wolny
+ Wstęp wolny
</string>
<string name="CostToJoin">
L$[AMOUNT] by dołączyć
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/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 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 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_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 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 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
index bd39ff7ac3..ae860249bb 100644
--- a/indra/newview/skins/default/xui/pl/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/pl/mime_types_mac.xml
@@ -2,13 +2,13 @@
<mimetypes name="default">
<widgetset name="web">
<label name="web_label">
- Zawartość Przeglądarki Internetowej
+ Zawartość przeglądarki internetowej
</label>
<tooltip name="web_tooltip">
- To miejsce posiada zawartość internetową
+ W tym miejscu można zobaczyć zawartość przeglądarki internetowej
</tooltip>
<playtip name="web_playtip">
- Pokaż Zawartość Przeglądarki Internetowej
+ Pokaż zawartość przeglądarki internetowej
</playtip>
</widgetset>
<widgetset name="movie">
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 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
index 5c362ab772..917610d3e9 100644
--- a/indra/newview/skins/default/xui/pl/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/pl/panel_avatar_list_item.xml
@@ -22,4 +22,5 @@
[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_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
index 5efa402698..b5e1828588 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_tattoo.xml
+++ b/indra/newview/skins/default/xui/pl/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="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ę"/>
+ <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 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 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 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 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
index e8e819e7ce..a8b4056976 100644
--- a/indra/newview/skins/default/xui/pl/panel_group_list_item.xml
+++ b/indra/newview/skins/default/xui/pl/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="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 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 6a0cbbd23a..8a422e2586 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?
@@ -57,7 +57,7 @@ Istnieje wiele Przywilei.
</tab_container>
<panel name="members_footer">
<text name="static">
- Przypisani Członkowie
+ Przywileje
</text>
<scroll_list name="member_assigned_roles">
<scroll_list.columns label="" name="checkbox"/>
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
index dc73d08680..64479176fa 100644
--- a/indra/newview/skins/default/xui/pl/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/pl/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="Cofnij"/>
<text name="title" value="Profil Miejsca"/>
<scroll_container name="place_scroll">
<panel name="scrolling_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 42088eae28..6b0061926b 100644
--- a/indra/newview/skins/default/xui/pl/panel_login.xml
+++ b/indra/newview/skins/default/xui/pl/panel_login.xml
@@ -13,7 +13,7 @@
</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"/>
+ <check_box label="Zapamiętaj Hasło" name="remember_check"/>
<text name="start_location_text">
Rozpocznij w:
</text>
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
index 4d91c3cdc8..939bcbbb42 100644
--- a/indra/newview/skins/default/xui/pl/panel_media_settings_permissions.xml
+++ b/indra/newview/skins/default/xui/pl/panel_media_settings_permissions.xml
@@ -11,10 +11,10 @@
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="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="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="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
index 162df37e52..5e7fd46754 100644
--- a/indra/newview/skins/default/xui/pl/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/pl/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="Aktualne Ubranie"/>
- <accordion_tab name="tab_outfits" title="Moje Ubrania"/>
- </accordion>
+<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
index ff65cd2abb..09958c84d6 100644
--- a/indra/newview/skins/default/xui/pl/panel_people.xml
+++ b/indra/newview/skins/default/xui/pl/panel_people.xml
@@ -3,17 +3,18 @@
<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 przyjaciół"/>
- <string name="no_friends" value="Brak przyjaciół"/>
- <string name="no_groups" value="Brak grup"/>
+ <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 wybranych Rezydentów do swojej listy znajomych"/>
+ <button name="add_friend_btn" tool_tip="Dodaj wybranego Rezydenta do Znajomych"/>
</panel>
</panel>
<panel label="ZNAJOMI" name="friends_panel">
@@ -26,6 +27,10 @@
<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">
@@ -37,17 +42,18 @@
<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="Zaproponuj znajomość"/>
+ <button name="add_friend_btn" tool_tip="Dodaj wybranego Rezydenta do Znajomych"/>
</panel>
</panel>
</tab_container>
<panel name="button_bar">
- <button label="Profil" name="view_profile_btn" tool_tip="Pokaż grafiki, grupy oraz inne informacje dostępne o Rezydentach"/>
- <button label="IM" name="im_btn" tool_tip="Rozpocznij rozmowÄ™ prywatnÄ… (IM)"/>
- <button label="Zadzwoń" name="call_btn" tool_tip="Zadzwoń do tego Rezydenta"/>
- <button label="Podziel siÄ™" name="share_btn"/>
- <button label="Teleportuj" name="teleport_btn" tool_tip="Zaproponuj teleportacjÄ™"/>
- <button label="Profil grupy" name="group_info_btn" tool_tip="Pokaż informacje o grupie"/>
- <button label="Konferencja Grupowa" name="chat_btn" tool_tip="Rozpocznij konferencÄ™"/>
+ <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_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 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 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 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 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 d72f13fabd..9504019f79 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
@@ -3,7 +3,7 @@
<panel.string name="log_in_to_change">
Zaloguj się ponownie, aby zmienić
</panel.string>
- <button label="Wyczyść Historię" name="clear_cache"/>
+ <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>
@@ -11,7 +11,6 @@
<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"/>
- <check_box label="Zezwól na Automatyczne Uruchomianie Mediów Strumieniowych" name="autoplay_enabled"/>
<text name="Logs:">
Logi:
</text>
@@ -19,7 +18,7 @@
<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">
- Pokazuj miejsce logu
+ Lokalizacja zapisu:
</text>
<button label="PrzeglÄ…daj" label_selected="PrzeglÄ…daj" name="log_path_button"/>
<button label="Lista Zablokowanych" name="block_list"/>
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..f74f4f2333 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 initial_value="prawda" label="Zezwalaj na wtyczki" name="browser_plugins_enabled"/>
+ <check_box initial_value="prawda" label="Akceptuj ciasteczka z Internetu" name="cookies_enabled"/>
+ <check_box initial_value="prawda" label="Zezwalaj na Javascript" name="browser_javascript_enabled"/>
+ <check_box initial_value="false" 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..04372208d6 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
@@ -2,13 +2,20 @@
<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"/>
<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" value="prawda"/>
+ <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" value="prawda"/>
+ <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
index 1ff115e0b5..766ed94822 100644
--- a/indra/newview/skins/default/xui/pl/panel_profile.xml
+++ b/indra/newview/skins/default/xui/pl/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="Brak"/>
+ <string name="no_group_text" value="Żadne"/>
<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=":"/>
- </panel>
- <text name="me_homepage_text">
- Strona Domowa:
- </text>
- <text name="title_member_text" value="Członek od:"/>
- <text name="title_acc_status_text" value="Status Konta:"/>
- <text name="acc_status_text" value="Rezydent. Brak Danych Konta"/>
- <text name="title_partner_text" value="Partner:"/>
- <text name="title_groups_text" value="Groupy:"/>
- </panel>
- </scroll_container>
- <panel name="profile_buttons_panel">
- <button label="Dodaj Znajomość" name="add_friend" tool_tip="Dodaj tego Rezydenta do znajomych"/>
- <button label="IM" name="im" tool_tip="Rozpocznij rozmowÄ™ prywatnÄ…"/>
- <button label="Zadzwoń" name="call" tool_tip="Zadzwoń do tego Rezydenta"/>
- <button label="Mapa" name="show_on_map_btn" tool_tip="Pokaż tego Rezydenta na mapie"/>
- <button label="Teleportuj" name="teleport" tool_tip="Zaoferuj TeleportacjÄ™"/>
- <button label="▼" name="overflow_btn" tool_tip="Zapłać lub wyślij obiekt temu Rezydentowi"/>
- </panel>
- <panel name="profile_me_buttons_panel">
- <button label="Edytuj Profil" name="edit_profile_btn"/>
- <button label="Edytuj WyglÄ…d" 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="Ż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 31b410c931..2b37dd96b7 100644
--- a/indra/newview/skins/default/xui/pl/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/pl/panel_region_covenant.xml
@@ -31,7 +31,7 @@
wszystkich posiadłościach majątku.
</text>
<text bottom_delta="-36" name="covenant_instructions">
- Przeciągnij oraz wrzuć notkę by zmienić umowę dla tego majątku.
+ Przeciągnij oraz wrzuć notę by zmienić umowę dla tego majątku.
</text>
<text name="region_section_lbl">
Region
@@ -58,13 +58,13 @@ wszystkich posiadłościach majątku.
Odsprzedaj:
</text>
<text left="115" name="resellable_clause" width="350">
- Posiadłość zakupiona w tym regionie nie może być odsprzedana.
+ Posiadłość kupiona w tym Regionie nie może być odsprzedana.
</text>
<text name="changeable_lbl">
Podziel:
</text>
<text left="115" name="changeable_clause" width="350">
- Posiadłość zakupiona w tym regionie nie może być
+ 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 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 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 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 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 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_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_side_tray.xml b/indra/newview/skins/default/xui/pl/panel_side_tray.xml
index 369097cd0b..f34fd0e108 100644
--- a/indra/newview/skins/default/xui/pl/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/pl/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="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="Info o Grupie" name="panel_group_info_sidetray"/>
+ <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="Edytuj swój publiczny profil oraz ulubione zakładki." name="sidebar_me" tab_title="My Profile">
- <panel label="Ja" name="panel_me"/>
+ <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>
- <sidetray_tab description="PrzeglÄ…daj SzafÄ™." name="sidebar_inventory" tab_title="My Inventory">
- <panel label="Edytuj SzafÄ™" name="sidepanel_inventory"/>
- </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
index e47a15b67a..0f99f3911c 100644
--- a/indra/newview/skins/default/xui/pl/panel_stand_stop_flying.xml
+++ b/indra/newview/skins/default/xui/pl/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="Wstań" name="stand_btn" tool_tip="Kliknij tutaj by wstać."/>
- <button label="Zatrzymaj Latanie" name="stop_fly_btn" tool_tip="Zatrzymaj Latanie"/>
+ <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 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
index d88d98f104..d143843eaf 100644
--- a/indra/newview/skins/default/xui/pl/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/pl/panel_teleport_history.xml
@@ -4,6 +4,7 @@
<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"/>
@@ -11,4 +12,7 @@
<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 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
index b70c76f652..3b038a7102 100644
--- a/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="item properties" title="Właściwości Obiektu w Szafie">
+<panel name="item properties" title="Profil Obiektu">
<panel.string name="unknown">
(nieznany)
</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="Właściwości Obiektu"/>
+ <text name="title" value="Profil Obiektu"/>
+ <text name="where" value="(Szafa)"/>
<panel label="">
<text name="LabelItemNameTitle">
Nazwa:
@@ -37,34 +38,36 @@
<text name="LabelAcquiredDate">
Wed May 24 12:50:46 2006
</text>
- <text name="OwnerLabel">
- Ty:
- </text>
- <check_box label="Edytuj" name="CheckOwnerModify"/>
- <check_box label="Kopiuj" name="CheckOwnerCopy"/>
- <check_box label="Oddawaj" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">
- Każdemu:
- </text>
- <check_box label="Kopiuj" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">
- Groupa:
- </text>
- <check_box label="Podziel siÄ™" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel">
- Następny właściciel:
- </text>
- <check_box label="Edytuje" name="CheckNextOwnerModify"/>
- <check_box label="Kopiuje" name="CheckNextOwnerCopy"/>
- <check_box label="Oddaje" name="CheckNextOwnerTransfer"/>
+ <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:" name="Edit Cost"/>
- <text name="CurrencySymbol">
- L$
- </text>
+ <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 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 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/pt/floater_about.xml b/indra/newview/skins/default/xui/pt/floater_about.xml
index 39548dc497..7671f58691 100644
--- a/indra/newview/skins/default/xui/pt/floater_about.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about.xml
@@ -38,23 +38,18 @@ Versão Vivox: [VIVOX_VERSION]
</floater.string>
<tab_container name="about_tab">
<panel label="Info" name="support_panel">
- <button label="Copiar para área de transferência" name="copy_btn"/>
+ <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: (in progress)
+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.
-
-
-
-
-Raras são as mentes capazes de tornar óbvio o até então inexistente. Dizer &apos;eu poderia ter pensado a mesma coisa&apos; é comum, revelador e nem sempre a verdade; porque de fato não pensaram.
- -- Douglas Adams
+&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">
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 ebb9bfc32d..787836a8bd 100644
--- a/indra/newview/skins/default/xui/pt/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml
@@ -1,5 +1,14 @@
<?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>
@@ -15,7 +24,7 @@
<tab_container name="landtab">
<panel label="GERAL" name="land_general_panel">
<panel.string name="new users only">
- Somente novos usuários
+ Somente novos residentes
</panel.string>
<panel.string name="anyone">
Qualquer um
@@ -30,10 +39,10 @@
ID do Leilão: [ID]
</panel.string>
<panel.string name="need_tier_to_modify">
- Você deve ter sua compra aprovada para modificar este terreno.
+ Sua compra deve ser aprovada para você modificar este terreno.
</panel.string>
<panel.string name="group_owned_text">
- (Possuído pelo Grupo)
+ (Propriedade do grupo)
</panel.string>
<panel.string name="profile_text">
Perfil...
@@ -48,11 +57,11 @@
(nenhum)
</panel.string>
<panel.string name="sale_pending_text">
- (Venda Pendente)
+ (Venda pendendo)
</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.
+Vá para o menu Mundo &gt; Sobre o terreno ou selecione outro lote para mostrar os detalhes.
</panel.string>
<text name="Name:">
Nome:
@@ -70,7 +79,7 @@ Vá para o menu Mundo &gt; Sobre a Terra ou selecione outro lote para mostrar se
Classificação:
</text>
<text name="ContentRatingText">
- Adult
+ Adulto
</text>
<text name="Owner:">
Proprietário:
@@ -84,32 +93,32 @@ Vá para o menu Mundo &gt; Sobre a Terra ou selecione outro lote para mostrar se
<text name="GroupText">
Leyla Linden
</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."/>
+ <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
@@ -126,34 +135,32 @@ Vá para o menu Mundo &gt; Sobre a Terra ou selecione outro lote para mostrar se
<text name="DwellText">
0
</text>
- <button label="Comprar Terra..." label_selected="Comprar Terra..." left="130" name="Buy Land..." width="125"/>
+ <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..." 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."/>
+ <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">
- Terra comprada nesta região pode ser revendida.
+ Permitido para terrenos comprados nesta região.
</panel.string>
<panel.string name="can_not_resell">
- Terra comprada nesta região não pode ser revendida.
+ Proibido para terrenos comprados nesta região.
</panel.string>
<panel.string name="can_change">
- Terra comprada nesta região pode ser compartilhada
-ou sub-dividida.
+ Permitido subdividir terrenos comprados nesta região.
</panel.string>
<panel.string name="can_not_change">
- Terra comprada nesta região não pode ser compartilhada
-ou sub-dividida.
+ Proibido compartilhar ou subdividir terrenos comprados nesta região.
</panel.string>
<text name="estate_section_lbl">
Propriedade:
</text>
<text name="estate_name_text">
- mainland
+ continente
</text>
<text name="estate_owner_lbl">
Dono:
@@ -165,7 +172,7 @@ ou sub-dividida.
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:
@@ -183,19 +190,19 @@ ou sub-dividida.
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>
<panel label="OBJETOS" name="land_objects_panel">
@@ -206,7 +213,7 @@ ou sub-dividida.
[COUNT] de [MAX] ([DELETED] serão deletados)
</panel.string>
<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 de prims:
@@ -215,13 +222,13 @@ ou sub-dividida.
[COUNT] de [MAX] ([AVAILABLE] disponíveis)
</text>
<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]
@@ -233,38 +240,38 @@ 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">
- Devolver objetos de outros residentes automaticamente (digite 0 para desligar)
+ <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" left="118" name="Refresh List" tool_tip="Refresh Object List"/>
- <button label="Retornar objetos..." label_selected="Retornar objetos..." left="230" name="Return objects..."/>
+ <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">
<name_list.columns label="Tipo" name="type"/>
<name_list.columns label="Nome" name="name"/>
@@ -284,82 +291,82 @@ Apenas lotes maiores podem ser listados na busca.
Esta opção está desabilitada porque você não pode modificar as opções deste lote.
</panel.string>
<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">
- Sem Empurrar
+ Proibido empurrar
</panel.string>
<panel.string name="push_restrict_region_text">
- Sem Empurrar (Imposição na Região)
+ 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 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="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 left="172" name="allow_label2">
- Criar Objetos:
+ <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 left="172" name="allow_label3">
- Entrada do Objeto:
+ <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 left="172" name="allow_label4">
- Executar Scripts:
+ <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 de Terra:
+ Opções do terreno:
</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="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="Qualquer categoria" name="item0"/>
<combo_box.item label="Locação Linden" name="item1"/>
- <combo_box.item label="Adult" name="item2"/>
- <combo_box.item label="Artes e Cultura" name="item3"/>
+ <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="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="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="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="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 Mature" name="MatureCheck" tool_tip=""/>
+ <check_box label="Conteúdo adulto" name="MatureCheck" tool_tip=""/>
<text name="Snapshot:">
Foto:
</text>
@@ -367,14 +374,14 @@ Apenas lotes maiores podem ser listados na busca.
<text name="landing_point">
Ponto de Aterrissagem: [LANDING]
</text>
- <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:
+ Rota de teletransporte:
</text>
- <combo_box left="140" name="landing type" tool_tip="Rota de Teletransporte -- Selecione como tratar os tele-transportes no seu lote." width="160">
+ <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="Ponto de aterrissagem" name="LandingPoint"/>
<combo_box.item label="Qualquer lugar" name="Anywhere"/>
</combo_box>
</panel>
@@ -388,7 +395,7 @@ Apenas lotes maiores podem ser listados na busca.
</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."/>
+ <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>
@@ -399,7 +406,7 @@ Textura:
</text>
<texture_picker label="" left="97" name="media texture" tool_tip="Clique para escolher uma imagem"/>
<text name="replace_texture_help">
- 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.
+ 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."/>
<text left="102" name="media_size" tool_tip="Tamanho para desenhar a mídia Web, deixar 0 como padrão." width="115">
@@ -414,7 +421,7 @@ Textura:
Opções de
Mídia:
</text>
- <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="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="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."/>
@@ -426,26 +433,29 @@ Mídia:
<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="Acesso para público categoria [MATURITY]" name="public_access"/>
<text name="Only Allow">
Restringir acesso a contas confirmardas por:
</text>
<check_box label="Dados de pagamento fornecidos [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Banir residentes sem identificação."/>
- <check_box label="Idade confirmada: [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="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 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"/>
+ <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>
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 78bcde251a..3ec81612a1 100644
--- a/indra/newview/skins/default/xui/pt/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_animation_preview.xml
@@ -141,35 +141,35 @@ A duração máxima de animação permitida é de [MAX_LENGTH] segundos.
Expressão
</text>
<combo_box left_delta="100" name="emote_combo" tool_tip="Controla as expressões faciais durante a animação" width="184">
- <combo_box.item label="(nenhum)" name="[None]"/>
- <combo_box.item label="Aaaaah" name="Aaaaah"/>
- <combo_box.item label="Com medo" name="Afraid"/>
- <combo_box.item label="Bravo" name="Angry"/>
- <combo_box.item label="Sorriso contagiante" name="BigSmile"/>
- <combo_box.item label="À toa" name="Bored"/>
- <combo_box.item label="Chorar" name="Cry"/>
- <combo_box.item label="Desdenho" name="Disdain"/>
- <combo_box.item label="Com vergonha" name="Embarrassed"/>
- <combo_box.item label="Franzir testa" name="Frown"/>
- <combo_box.item label="Beijo" name="Kiss"/>
- <combo_box.item label="Rir" name="Laugh"/>
- <combo_box.item label="Mostrar a língua" name="Plllppt"/>
- <combo_box.item label="Asco" name="Repulsed"/>
- <combo_box.item label="Triste" name="Sad"/>
- <combo_box.item label="Encolher os ombros" name="Shrug"/>
- <combo_box.item label="Sorriso" name="Smile"/>
- <combo_box.item label="Surpresa" name="Surprise"/>
- <combo_box.item label="Piscar" name="Wink"/>
- <combo_box.item label="Preocupado" name="Worry"/>
+ <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" 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">
- <combo_box.item label="Em pé" name="Standing"/>
- <combo_box.item label="Andando" name="Walking"/>
- <combo_box.item label="Sentado" name="Sitting"/>
- <combo_box.item label="Voando" name="Flying"/>
+ <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="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"/>
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 9f34111d8a..8823d04b62 100644
--- a/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml
@@ -7,20 +7,20 @@
Definindo permissões em [NAME]
</floater.string>
<floater.string name="start_text">
- Iniciando solicitação de mudança de permissão...
+ 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"/>
<icon name="icon_animation" tool_tip="Animação"/>
- <check_box label="Partes do Corpo" name="check_bodypart"/>
+ <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"/>
<icon name="icon_gesture" tool_tip="Gestos"/>
- <check_box label="Notecards" name="check_notecard"/>
+ <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"/>
@@ -30,7 +30,7 @@
<icon name="icon_sound" tool_tip="Sons"/>
<check_box label="Texturas" name="check_texture"/>
<icon name="icon_texture" tool_tip="Texturas"/>
- <button label="√ Tudo" label_selected="Todas" name="check_all"/>
+ <button label="Tudo" label_selected="Todas" name="check_all"/>
<button label="Limpar" label_selected="Nenhuma" name="check_none"/>
<text name="newperms">
Novas autorizações de conteúdo
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 1d0b3c4cd9..a737212b50 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
@@ -37,7 +37,7 @@
Calculando...
</text>
<text name="buy_action">
- [NAME] L$ [PRICE]
+ [ACTION]
</text>
<text name="total_label">
Saldo resultante:
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 9500ba94e5..73b483acf2 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_land.xml
@@ -40,7 +40,8 @@
A área selecionada não tem terras públicas.
</floater.string>
<floater.string name="not_owned_by_you">
- Está selecionada uma terra pertencente a outro usuário. Tente selecionar uma área menor.
+ Terrenos de outros residentes foram selecionados.
+Tente selecionar uma área menor.
</floater.string>
<floater.string name="processing">
Processando sua compra...
diff --git a/indra/newview/skins/default/xui/pt/floater_camera.xml b/indra/newview/skins/default/xui/pt/floater_camera.xml
index 5114b19336..7989ce66bc 100644
--- a/indra/newview/skins/default/xui/pt/floater_camera.xml
+++ b/indra/newview/skins/default/xui/pt/floater_camera.xml
@@ -9,6 +9,18 @@
<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="orbit_mode_title">
+ Órbita
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ Pan
+ </floater.string>
+ <floater.string name="avatar_view_mode_title">
+ Predefinições
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Visualizar objeto
+ </floater.string>
<panel name="controls">
<joystick_track name="cam_track_stick" tool_tip="Move a câmera para cima e para baixo, direita e esquerda"/>
<panel name="zoom" tool_tip="Aproximar a Câmera in direção ao Foco">
@@ -25,7 +37,7 @@
<panel name="buttons">
<button label="" name="orbit_btn" tool_tip="Câmera orbital"/>
<button label="" name="pan_btn" tool_tip="Câmera Pan"/>
- <button label="" name="avatarview_btn" tool_tip="ver como o avatar"/>
+ <button label="" name="avatarview_btn" tool_tip="Predefinições"/>
<button label="" name="freecamera_btn" tool_tip="Visualizar objeto"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_customize.xml b/indra/newview/skins/default/xui/pt/floater_customize.xml
index 318c73e52d..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,7 @@
<?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">
- <text 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">
@@ -43,15 +43,15 @@
<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 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="Maquiagem" label_selected="Maquiagem" name="Makeup" width="115"/>
- <button label="Detalhes do Corpo" label_selected="Detalhes do Corpo" name="Body Detail" width="115"/>
+ <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>
@@ -79,7 +79,7 @@
<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="Criar Nova Pele" label_selected="Criar Nova Pele" name="Create New"/>
+ <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"/>
@@ -114,7 +114,7 @@
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"/>
@@ -145,7 +145,7 @@
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"/>
@@ -157,7 +157,7 @@
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
<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="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"/>
@@ -190,7 +190,7 @@
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
<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="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"/>
@@ -238,7 +238,7 @@
<text name="not worn instructions">
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"/>
+ <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>
@@ -271,7 +271,7 @@
<text name="not worn instructions">
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"/>
+ <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>
@@ -304,14 +304,14 @@
<text name="not worn instructions">
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"/>
+ <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="Selecionar a cor"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
@@ -338,7 +338,7 @@
<text name="not worn instructions">
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"/>
+ <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>
@@ -371,7 +371,7 @@
<text name="not worn instructions">
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"/>
+ <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>
@@ -404,12 +404,12 @@
<text name="not worn instructions">
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 Roupas de Baixo" label_selected="Criar Novas Roupas de Baixo" name="Create New" width="180"/>
+ <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="Selecionar a cor"/>
@@ -437,7 +437,7 @@
<text name="not worn instructions">
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"/>
+ <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>
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_event.xml b/indra/newview/skins/default/xui/pt/floater_event.xml
index 4b2489654a..1cd4dcbda4 100644
--- a/indra/newview/skins/default/xui/pt/floater_event.xml
+++ b/indra/newview/skins/default/xui/pt/floater_event.xml
@@ -9,6 +9,18 @@
<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">
@@ -21,12 +33,21 @@
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>
@@ -36,6 +57,9 @@
<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"/>
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 93b2f3e90d..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 sair, definir o destino com sua posição inicial."/>
+ <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,9 +63,9 @@
<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:">
diff --git a/indra/newview/skins/default/xui/pt/floater_im.xml b/indra/newview/skins/default/xui/pt/floater_im.xml
index f6057c48f1..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.
@@ -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_image_preview.xml b/indra/newview/skins/default/xui/pt/floater_image_preview.xml
index 2ff1aa7915..3582923ed0 100644
--- a/indra/newview/skins/default/xui/pt/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_image_preview.xml
@@ -11,16 +11,16 @@
imagem como:
</text>
<combo_box label="Tipo de Roupas" left="100" name="clothing_type_combo" width="186">
- <combo_box.item label="Imagem" name="Image"/>
- <combo_box.item label="Cabelo" name="Hair"/>
- <combo_box.item label="Cabeça de mulher" name="FemaleHead"/>
- <combo_box.item label="Cintura para cima, mulher" name="FemaleUpperBody"/>
- <combo_box.item label="Cintura para baixo, mulher" name="FemaleLowerBody"/>
- <combo_box.item label="Cabeça de homem" name="MaleHead"/>
- <combo_box.item label="Cintura para cima, homem" name="MaleUpperBody"/>
- <combo_box.item label="Cintura para baixo, homem" name="MaleLowerBody"/>
- <combo_box.item label="Saia" name="Skirt"/>
- <combo_box.item label="Prim esculpido" name="SculptedPrim"/>
+ <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_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 ecc4fcc9e9..98d8c0e319 100644
--- a/indra/newview/skins/default/xui/pt/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/pt/floater_joystick.xml
@@ -16,7 +16,7 @@
Modos de Controle:
</text>
<check_box label="Avatar" name="JoystickAvatarEnabled"/>
- <check_box label="Construir" left="192" name="JoystickBuildEnabled"/>
+ <check_box label="Construir" name="JoystickBuildEnabled"/>
<check_box label="Camera aérea" name="JoystickFlycamEnabled"/>
<text name="XScale">
Escala X
@@ -27,13 +27,13 @@
<text name="ZScale">
Escala Z
</text>
- <text left="3" name="PitchScale" width="115">
+ <text name="PitchScale">
Escala de Elevação
</text>
- <text left="3" name="YawScale" width="115">
+ <text name="YawScale">
Escala da Guinada
</text>
- <text left="3" name="RollScale" width="115">
+ <text name="RollScale">
Escala de Rolagem
</text>
<text name="XDeadZone">
@@ -45,13 +45,13 @@
<text name="ZDeadZone">
Zona Morta Z
</text>
- <text left="3" name="PitchDeadZone" width="115">
+ <text name="PitchDeadZone">
Zona Morta: Elevação
</text>
- <text left="3" name="YawDeadZone" width="115">
+ <text name="YawDeadZone">
Zona Morta: Guinada
</text>
- <text left="3" name="RollDeadZone" width="115">
+ <text name="RollDeadZone">
Zona Morta: Rolagem
</text>
<text name="Feathering">
@@ -60,7 +60,7 @@
<text name="ZoomScale2">
Escala de Zoom
</text>
- <text left="4" name="ZoomDeadZone" width="110">
+ <text name="ZoomDeadZone">
Zona Morta de Zoom
</text>
<button font="SansSerifSmall" label="Padrões do SpaceNavigator" name="SpaceNavigatorDefaults"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_moveview.xml b/indra/newview/skins/default/xui/pt/floater_moveview.xml
index f67a16bb46..9c02570076 100644
--- a/indra/newview/skins/default/xui/pt/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_moveview.xml
@@ -18,6 +18,15 @@
<string name="fly_back_tooltip">
Voar para trás (flecha para baixo ou S)
</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="turn left btn" tool_tip="Virar à esquerda (flecha ESQ ou A)"/>
<button label="" label_selected="" name="turn right btn" tool_tip="Virar à direita (flecha DIR ou D)"/>
@@ -30,6 +39,5 @@
<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"/>
- <button label="Parar de voar" name="stop_fly_btn" tool_tip="Parar de voar"/>
</panel>
</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
index 8a536b90db..35afde7612 100644
--- a/indra/newview/skins/default/xui/pt/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/pt/floater_outgoing_call.xml
@@ -28,7 +28,7 @@
Você saiu da ligação com [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
</text>
<text name="nearby_P2P_by_other">
- [VOICE_CHANNEL_NAME] encerrou a ligação. [RECONNECT_NEARBY]
+ A ligação foi desligada. [RECONNECT_NEARBY]
</text>
<text name="nearby_P2P_by_agent">
Você encerrou a ligação. [RECONNECT_NEARBY]
diff --git a/indra/newview/skins/default/xui/pt/floater_postcard.xml b/indra/newview/skins/default/xui/pt/floater_postcard.xml
index d3c5b6ec23..9740fbcb4d 100644
--- a/indra/newview/skins/default/xui/pt/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/pt/floater_postcard.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Postcard" title="ENVIAR FOTO VIA EMAIL">
<text name="to_label" width="135">
- Email do Destinatário:
+ Para (email):
</text>
<line_editor left="143" name="to_form" width="127"/>
<text name="from_label">
- Seu Email:
+ De (email):
</text>
<line_editor left="143" name="from_form" width="127"/>
<text name="name_label">
@@ -16,7 +16,7 @@
Assunto:
</text>
<line_editor left="143" name="subject_form" width="127"/>
- <line_editor label="Digite seu assunto aqui." name="subject_form"/>
+ <line_editor label="Digite o assunto aqui" name="subject_form"/>
<text name="msg_label">
Mensagem:
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_preferences.xml b/indra/newview/skins/default/xui/pt/floater_preferences.xml
index 803f2f87b8..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,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater min_width="332" name="Preferences" title="PREFERÊNCIAS" width="628">
+<floater name="Preferences" title="PREFERÊNCIAS">
<button label="OK" label_selected="OK" name="OK"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <tab_container name="pref core" tab_width="128" width="628">
- <panel label="Público geral" name="general"/>
+ <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"/>
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_snapshot.xml b/indra/newview/skins/default/xui/pt/floater_snapshot.xml
index a3934a6667..b612442195 100644
--- a/indra/newview/skins/default/xui/pt/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/pt/floater_snapshot.xml
@@ -1,79 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="VER FOTO">
- <text name="type_label">
- Destino da foto
- </text>
- <radio_group label="Tipo de Foto" name="snapshot_type_radio">
- <radio_item label="Email" name="postcard"/>
- <radio_item label="Meu inventário (L$[AMOUNT])" name="texture"/>
- <radio_item label="Salvar no meu PC" name="local"/>
- </radio_group>
- <text name="file_size_label">
- [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 label="Salvar" name="save_item"/>
- <flyout_button.item label="Salvar como..." name="saveas_item"/>
- </flyout_button>
- <button label="Cancelar" name="discard_btn"/>
- <button label="Mais" name="more_btn" tool_tip="Opções avançadas"/>
- <button label="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 label="Janela Atual" 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="Customizado" name="Custom"/>
- </combo_box>
- <combo_box label="Resolução" name="texture_size_combo">
- <combo_box.item label="Janela Atual" name="CurrentWindow"/>
- <combo_box.item label="Pequeno (128x128)" name="Small(128x128)"/>
- <combo_box.item label="Médio (256x256)" name="Medium(256x256)"/>
- <combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
- <combo_box.item label="Customizado" name="Custom"/>
- </combo_box>
- <combo_box label="Resolução" name="local_size_combo">
- <combo_box.item label="Janela Atual" 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="Customizado" 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="Largura" label_width="41" name="snapshot_width" width="101"/>
- <spinner label="Altura" label_width="31" left="119" name="snapshot_height" width="91"/>
- <check_box label="Limitar proproçõ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 label="Cores" name="Colors"/>
- <combo_box.item label="Formato" name="Depth"/>
- <combo_box.item label="Decoração do Objeto" name="ObjectMattes"/>
- </combo_box>
- <check_box label="Interface" name="ui_check"/>
- <check_box bottom_delta="-17" label="HUDs" name="hud_check"/>
- <check_box bottom_delta="-17" label="Manter aberto após salvar" name="keep_open_check"/>
- <check_box bottom_delta="-17" label="Gerar quadro (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"/>
+ <button label="Compartilhar foto" name="share"/>
+ <button label="Compartilhar na web" name="share_to_web"/>
+ <button label="Salvar no meu inventário" name="save_to_inventory"/>
+ <button label="Salvar foto" name="save"/>
+ <button label="Enviar foto por email" name="share_to_email"/>
+ <button label="Salvar no meu PC" name="save_to_computer"/>
+ <button label="Usar como foto do perfil" name="set_profile_pic"/>
+ <button label="Atrás" name="cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml
index fb44c5c3bf..74b45f1d1e 100644
--- a/indra/newview/skins/default/xui/pt/floater_tools.xml
+++ b/indra/newview/skins/default/xui/pt/floater_tools.xml
@@ -63,12 +63,15 @@
<radio_item label="Stretch (Ctrl+Shift)" name="radio stretch"/>
<radio_item label="Face selecionada" name="radio select face"/>
</radio_group>
- <check_box label="Editar item linkado" name="checkbox edit linked parts"/>
+ <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>
- <check_box label="Esticar ambos os lados" name="checkbox uniform"/>
- <check_box initial_value="true" label="Esticar Texturas" name="checkbox stretch textures"/>
+ <check_box name="checkbox uniform"/>
+ <text name="checkbox uniform label">
+ Esticar ambos os 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"/>
@@ -91,7 +94,7 @@
<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="Ficar com ferramenta selecionado" name="checkbox sticky"/>
+ <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"/>
@@ -115,7 +118,7 @@
</text>
<button label="Aplicar" label_selected="Aplicar" name="button apply to selection" tool_tip="Modificar a terra selecionada"/>
<text left="134" name="obj_count">
- Objects: [COUNT]
+ Objetos: [COUNT]
</text>
<text left="134" name="prim_count">
Prims: [COUNT]
@@ -183,10 +186,10 @@
<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" width="220">
+ <text name="label click action">
Clique para:
</text>
- <combo_box name="clickaction" width="192">
+ <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"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_tos.xml b/indra/newview/skins/default/xui/pt/floater_tos.xml
index 2fbbbde9e4..2675979783 100644
--- a/indra/newview/skins/default/xui/pt/floater_tos.xml
+++ b/indra/newview/skins/default/xui/pt/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 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">
- Leia com atenção os Termos do Serviço. Para continuar a entrar no [SECOND_LIFE], é preciso aceitar o contrato.
+ 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
index 6ab10db96f..5ef8479b7a 100644
--- a/indra/newview/skins/default/xui/pt/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/pt/floater_voice_controls.xml
@@ -17,7 +17,7 @@
</string>
<layout_stack name="my_call_stack">
<layout_panel name="my_panel">
- <text name="user_text" value="Mya Avatar:"/>
+ <text name="user_text" value="Meu avatar:"/>
</layout_panel>
<layout_panel name="leave_call_btn_panel">
<button label="Desligar" name="leave_call_btn"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_water.xml b/indra/newview/skins/default/xui/pt/floater_water.xml
index 36b995d4fd..b4613e0890 100644
--- a/indra/newview/skins/default/xui/pt/floater_water.xml
+++ b/indra/newview/skins/default/xui/pt/floater_water.xml
@@ -8,7 +8,7 @@
<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>
@@ -56,7 +56,7 @@
</text>
<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>
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_world_map.xml b/indra/newview/skins/default/xui/pt/floater_world_map.xml
index 95bb899071..efd90dfaa4 100644
--- a/indra/newview/skins/default/xui/pt/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/pt/floater_world_map.xml
@@ -5,8 +5,7 @@
Legenda
</text>
</panel>
- <panel
- name="layout_panel_2">
+ <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" width="135"/>
<text name="me_label">
Eu
@@ -24,60 +23,56 @@
Venda de terreno
</text>
<text name="by_owner_label">
- pelo dono
+ o proprietário
</text>
<text name="auction_label">
leilão de terrenos
</text>
- <button label="Ir para Casa" label_selected="Ir para casa" name="Go Home" tool_tip="Teletransportar para minha casa"/>
+ <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">
- Casa
+ Início
</text>
<text name="events_label">
Eventos:
</text>
<check_box label="PG" name="event_chk"/>
<text name="pg_label">
- Geral
+ Público geral
</text>
- <check_box initial_value="true" label="Mature" name="event_mature_chk"/>
+ <check_box initial_value="verdadeiro" label="Mature" name="event_mature_chk"/>
<text name="mature_label">
Moderado
</text>
<check_box label="Adult" name="event_adult_chk"/>
<text name="adult_label">
- Público adulto
+ Adulto
</text>
</panel>
- <panel
- name="layout_panel_3">
+ <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 Conectados" name="friend combo" tool_tip="Mostrar amigos no mapa">
+ <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 de uma Região"/>
- <button label="Buscar" name="DoSearch" tool_tip="Procurar por região"/>
- <button name="Clear" tool_tip="Limpara linhas e redefinir mapa"/>
- <button font="SansSerifSmall" label="Teletransporte" label_selected="Teletransporte" name="Teleport" tool_tip="Teletransportar para a posição selecionada"/>
+ <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="Centralizar mapa na posição selecionada" width="135"/>
+ <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">
+ <panel name="layout_panel_5">
<text name="zoom_label">
Zoom
</text>
</panel>
- <panel
- name="layout_panel_6">
+ <panel name="layout_panel_6">
<slider label="Zoom" name="zoom slider"/>
</panel>
</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
index b6cf896836..cfd69158bc 100644
--- a/indra/newview/skins/default/xui/pt/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/pt/menu_attachment_other.xml
@@ -10,7 +10,7 @@
<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" name="Debug..."/>
+ <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"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_attachment_self.xml b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml
index 04f6227141..de3178b946 100644
--- a/indra/newview/skins/default/xui/pt/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml
@@ -9,4 +9,5 @@
<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_other.xml b/indra/newview/skins/default/xui/pt/menu_avatar_other.xml
index 21c2cb196a..a4a26144c7 100644
--- a/indra/newview/skins/default/xui/pt/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/pt/menu_avatar_other.xml
@@ -10,7 +10,7 @@
<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" name="Debug..."/>
+ <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
index abbf2e7032..ccbb921ebc 100644
--- a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
@@ -24,4 +24,5 @@
<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_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_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml
index cdd8959cd4..6a511e6ab7 100644
--- a/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml
@@ -11,7 +11,7 @@
<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" name="debug"/>
+ <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"/>
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
index 2eba4ccb2d..effc970eb8 100644
--- a/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml
@@ -5,4 +5,5 @@
<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 8b565b9645..345534261a 100644
--- a/indra/newview/skins/default/xui/pt/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inventory.xml
@@ -1,26 +1,27 @@
<?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="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_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 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"/>
@@ -48,34 +49,37 @@
<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="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="Excluir pasta do sistema" name="Delete System Folder"/>
- <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="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="Tocar inworld" 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="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="Salvar como" name="Save As"/>
- <menu_item_call label="Retirar de você" name="Detach From Yourself"/>
- <menu_item_call label="Vestir" name="Object Wear"/>
+ <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="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
index 81898c63bf..fc40384891 100644
--- a/indra/newview/skins/default/xui/pt/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml
@@ -24,7 +24,7 @@
<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 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"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_login.xml b/indra/newview/skins/default/xui/pt/menu_login.xml
index 6cc83d11d0..8ea87a06d1 100644
--- a/indra/newview/skins/default/xui/pt/menu_login.xml
+++ b/indra/newview/skins/default/xui/pt/menu_login.xml
@@ -6,19 +6,10 @@
</menu>
<menu label="Ajuda" name="Help">
<menu_item_call label="Ajuda do [SECOND_LIFE]" name="Second Life Help"/>
+ <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 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>
<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"/>
@@ -26,5 +17,7 @@
<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 f7b86b8f22..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,5 +1,5 @@
<?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"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_object.xml b/indra/newview/skins/default/xui/pt/menu_object.xml
index 5121c9d048..a5969cacc3 100644
--- a/indra/newview/skins/default/xui/pt/menu_object.xml
+++ b/indra/newview/skins/default/xui/pt/menu_object.xml
@@ -5,6 +5,7 @@
<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">
diff --git a/indra/newview/skins/default/xui/pt/menu_participant_list.xml b/indra/newview/skins/default/xui/pt/menu_participant_list.xml
index 849dec3108..c0db7752af 100644
--- a/indra/newview/skins/default/xui/pt/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/pt/menu_participant_list.xml
@@ -8,6 +8,7 @@
<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">
diff --git a/indra/newview/skins/default/xui/pt/menu_profile_overflow.xml b/indra/newview/skins/default/xui/pt/menu_profile_overflow.xml
index 2635182290..d41ecbd755 100644
--- a/indra/newview/skins/default/xui/pt/menu_profile_overflow.xml
+++ b/indra/newview/skins/default/xui/pt/menu_profile_overflow.xml
@@ -1,5 +1,6 @@
<?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"/>
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..a957708ae4
--- /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 novo" 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_teleport_history_item.xml b/indra/newview/skins/default/xui/pt/menu_teleport_history_item.xml
index b4216b7ddc..ec1e7a0950 100644
--- a/indra/newview/skins/default/xui/pt/menu_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/pt/menu_teleport_history_item.xml
@@ -2,5 +2,5 @@
<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 para área de transferência" name="CopyToClipboard"/>
+ <menu_item_call label="Copiar" name="CopyToClipboard"/>
</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 2b83386cad..84ad056df6 100644
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -31,6 +31,7 @@
<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>
@@ -46,8 +47,8 @@
<menu_item_check label="Coordenadas" name="Coordinates"/>
<menu_item_check label="Propriedades do lote" name="Parcel Properties"/>
</menu>
- <menu_item_call label="Teletransportar para início" name="Teleport Home"/>
- <menu_item_call label="Definir como casa" name="Set Home to Here"/>
+ <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"/>
@@ -66,21 +67,10 @@
<menu_item_call label="Ferramenta criar" name="Create"/>
<menu_item_call label="Ferramenta de terrenos" name="Land"/>
</menu>
- <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>
<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_item_call label="Focus on Selection" name="Focus on Selection"/>
+ <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"/>
@@ -92,37 +82,39 @@
<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="Reset Scripts" name="Reset Scripts"/>
+ <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="Set Default Upload Permissions" name="perm prefs"/>
+ <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 meus objetos" name="Select Only Movable 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="Show Light Radius for Selection" name="Show Light Radius for Selection"/>
- <menu_item_check label="Show Selection Beam" name="Show Selection Beam"/>
- <menu_item_check label="Mostrar na grade" name="Snap to Grid"/>
- <menu_item_call label="Snap Object XY to Grid" name="Snap Object XY to Grid"/>
+ <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="Selecionar partes conectadas" name="Select Linked Parts">
- <menu_item_call label="Select Next Part" name="Select Next Part"/>
- <menu_item_call label="Select Previous Part" name="Select Previous Part"/>
- <menu_item_call label="Include Next Part" name="Include Next Part"/>
- <menu_item_call label="Include Previous Part" name="Include Previous Part"/>
+ <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>
<menu label="Ajuda" name="Help">
<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"/>
@@ -133,9 +125,9 @@
<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="Lag Meter" name="Lag Meter"/>
+ <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="Show Avatar Rendering Cost" name="Avatar Rendering Cost"/>
+ <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"/>
@@ -144,7 +136,6 @@
<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_item_check label="Mostrar dicas de terreno" name="Land Tips"/>
</menu>
<menu label="Tipos de renderização" name="Rendering Types">
<menu_item_check label="Simples" name="Simple"/>
@@ -166,13 +157,13 @@
<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="Foot Shadows" name="Foot Shadows"/>
- <menu_item_check label="Fog" name="Fog"/>
- <menu_item_check label="Flexible Objects" name="Flexible Objects"/>
+ <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_call label="Limpar cache de grupo" name="ClearGroupCache"/>
- <menu_item_check label="Mouse Smoothing" name="Mouse Smoothing"/>
+ <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"/>
@@ -205,7 +196,7 @@
<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="Debug Console" name="Debug 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"/>
@@ -218,7 +209,7 @@
</menu>
<menu label="Show Info" name="Display Info">
<menu_item_check label="Mostrar hora" name="Show Time"/>
- <menu_item_check label="Show Render Info" name="Show Render Info"/>
+ <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>
@@ -239,7 +230,7 @@
</menu>
<menu label="Rendering" name="Rendering">
<menu_item_check label="Axes" name="Axes"/>
- <menu_item_check label="Contornos" name="Wireframe"/>
+ <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"/>
@@ -247,11 +238,11 @@
<menu_item_check label="Render Attached Particles" name="Render Attached Particles"/>
<menu_item_check label="Objetos iridescentes" name="Hover Glow Objects"/>
</menu>
- <menu label="Network" name="Network">
+ <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="Bumps, Pushes &amp; Hits" name="Bumps, Pushes &amp;amp; Hits"/>
+ <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"/>
@@ -261,15 +252,15 @@
<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="Memory Stats" name="Memory Stats"/>
+ <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="Show Font Test" name="Show Font Test"/>
- <menu_item_call label="Load from XML" name="Load from XML"/>
+ <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"/>
@@ -306,7 +297,7 @@
<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="Lock" name="Lock"/>
+ <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"/>
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index 60113bcf0b..462dcf2b21 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -106,7 +106,7 @@ Por favor, selecione apenas um objeto e tente novamente.
</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="Sim"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="GrantModifyRights">
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.
@@ -199,7 +199,7 @@ Convite outros membros dentro de 48 horas.
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>
@@ -211,24 +211,24 @@ 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?
@@ -237,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?
@@ -245,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?
@@ -259,10 +259,10 @@ 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>
@@ -301,7 +301,7 @@ Para colocar a mídia em só uma face, selecione Selecionar face e clique na fac
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.
@@ -311,17 +311,17 @@ Para colocar a mídia em só uma face, selecione Selecionar face e clique na fac
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="AddClassified">
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.
@@ -349,8 +349,8 @@ Tem certeza de que quer prosseguir?
<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] ?
@@ -360,10 +360,10 @@ Tem certeza de que quer prosseguir?
<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.
+ Selecione um item do histórico para exibi-lo.
</notification>
<notification name="CacheWillClear">
O cache será limpo quando o [APP_NAME] for iniciado.
@@ -406,7 +406,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.
@@ -415,7 +415,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.
@@ -426,7 +426,7 @@ O objeto pode estar fora de alcance ou ter sido deletado.
</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;Minha casa&apos; como ponto 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">
@@ -442,7 +442,6 @@ O objeto pode estar fora de alcance ou ter sido deletado.
<notification name="UnsupportedHardware">
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
Consultar [_URL] para mais informações?
<url name="url" option="0">
http://secondlife.com/support/sysreqs.php?lang=pt
@@ -501,15 +500,15 @@ 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">
@@ -520,7 +519,7 @@ Ele ou ela vai ficar temporariamente incapaz de se mover, usar o bate-papo ou in
</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]
@@ -767,29 +766,29 @@ Nenhum grupo selecionado.
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="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.
@@ -808,25 +807,25 @@ A região do terreno não pôde ser localizada.
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.
@@ -842,34 +841,34 @@ Quer dividir o terreno?
A região do terreno não pôde ser localizada.
</notification>
<notification name="CannotJoinLandNoRegion">
- Houve um problema ao processar a junção dos terrenos:
+ 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="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">
@@ -919,6 +918,16 @@ 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 name="RemoveFromFriends">
Você quer remover [FIRST_NAME] [LAST_NAME] da sua lista de amigos?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Remover"/>
@@ -1018,24 +1027,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.
@@ -1058,7 +1066,7 @@ Você chegou a uma região próxima.
<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 casa.
+Pense em usar outra região como seu início.
</notification>
<notification name="ClothingLoading">
As suas roupas estão sendo transferidas.
@@ -1118,7 +1126,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">
@@ -1283,19 +1291,19 @@ Salvar na pasta Aplicativos?
</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, 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="Falha ao bloquear objeto por nome" name="MuteByNameFailed">
Você já bloqueou este residente.
@@ -1328,7 +1336,7 @@ O bate-papo e MIs não serão exibidos. MIs enviadas para você receberão sua
<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ê.
@@ -1348,7 +1356,7 @@ O bate-papo e MIs não serão exibidos. MIs enviadas para você receberão sua
</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).
@@ -1358,7 +1366,7 @@ O bate-papo e MIs não serão exibidos. MIs enviadas para você receberão sua
</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.
@@ -1378,7 +1386,7 @@ O bate-papo e MIs não serão exibidos. MIs enviadas para você receberão sua
</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]
@@ -1399,6 +1407,10 @@ O bate-papo e MIs não serão exibidos. MIs enviadas para você receberão sua
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.
<form name="form">
@@ -1408,11 +1420,11 @@ O bate-papo e MIs não serão exibidos. MIs enviadas para você receberão sua
</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">
@@ -1490,6 +1502,9 @@ Clique em &apos;Mudar preferência&apos; para aumentar o nível de maturidade e
<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.
@@ -1905,6 +1920,9 @@ Inclua um link para facilitar o acesso para visitantes. Teste o link na barra de
<notification name="SystemMessageTip">
[MESSAGE]
</notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
<notification name="Cancelled">
Cancelado
</notification>
@@ -1933,6 +1951,11 @@ Inclua um link para facilitar o acesso para visitantes. Teste o link na barra de
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>
@@ -2126,7 +2149,7 @@ Objetos não transferíveis dados ao grupo foram deletados.
</notification>
<notification name="NotSafe">
A opção &apos;danos&apos; desta região está ativada.
-Você pode se dar mal aqui. Se você morre, você será teletransportado de volta para casa.
+Você pode se dar mal aqui. Se você morrer, você será teletransportado de volta para seu início.
</notification>
<notification name="NoFly">
Esta área desativou a opção de voar.
@@ -2271,9 +2294,9 @@ Por favor, tente novamente em alguns instantes.
</form>
</notification>
<notification name="TeleportOffered">
- [NAME] quer te teletransportar para a região deles:
+ [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"/>
@@ -2291,11 +2314,11 @@ 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"/>
@@ -2358,6 +2381,9 @@ 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 usar tem um recurso que seu Visualizador não consegue ler. Atualize o [APP_NAME] para poder vestir esse item.
</notification>
@@ -2399,14 +2425,6 @@ Deixar?
<button name="Ignore" text="Ignorar"/>
</form>
</notification>
- <notification name="ScriptToast">
- [FIRST] [LAST], &apos;[TITLE]&apos; está pedindo dados de usuário.
- <form name="form">
- <button name="Open" text="Abrir diálogo"/>
- <button name="Ignore" text="Ignorar"/>
- <button name="Block" text="Bloquear"/>
- </form>
- </notification>
<notification name="BuyLindenDollarSuccess">
Obrigado e volte sempre!
@@ -2533,7 +2551,7 @@ Para sua segurança, os SLurls serão bloqueados por alguns instantes.
</notification>
<notification name="ConfirmCloseAll">
Tem certeza de que quer fechar todas as MIs?
- <usetemplate name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <usetemplate ignoretext="Confirmar antes de fechar todas as MIs" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="AttachmentSaved">
Anexo salvo.
@@ -2562,6 +2580,12 @@ Para sua segurança, os SLurls serão bloqueados por alguns instantes.
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">
+ Arraste itens do inventário para uma pessoa no seletor de residentes
+ </notification>
+ <notification name="AvatarRezNotification">
+ O avatar de &apos;[NAME]&apos; renderizou em [TIME] s.
+ </notification>
<global name="UnsupportedCPU">
- A velocidade da sua CPU não suporta os requisitos mínimos exigidos.
</global>
@@ -2583,7 +2607,7 @@ Se você continuar a receber esta mensagem, consulte o [SUPPORT_SITE].
- A memória do seu sistema não suporta os requisitos mínimos exigidos.
</global>
<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 sua casa.
+ 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_classified_info.xml b/indra/newview/skins/default/xui/pt/panel_classified_info.xml
index 8441cd9913..191c005b1a 100644
--- a/indra/newview/skins/default/xui/pt/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/pt/panel_classified_info.xml
@@ -3,16 +3,46 @@
<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="[nome]"/>
- <text_editor name="classified_location" value="[carregando...]"/>
+ <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]"/>
- <check_box label="Renovar automaticamente todas as semanas" name="auto_renew"/>
- <text_editor name="price_for_listing" tool_tip="Preço do anúncio."/>
- <text_editor name="classified_desc" value="[descrição]"/>
+ <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">
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_classified.xml b/indra/newview/skins/default/xui/pt/panel_edit_classified.xml
index a754c5f070..f6fb223599 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_classified.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_classified.xml
@@ -3,12 +3,20 @@
<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">
- <icon label="" name="edit_icon" tool_tip="Selecione uma imagem"/>
+ <panel name="snapshot_panel">
+ <icon label="" name="edit_icon" tool_tip="Selecione uma imagem"/>
+ </panel>
<text name="Name:">
Cargo:
</text>
@@ -22,12 +30,19 @@
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="Salvar" name="save_changes_btn"/>
+ <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
index 2c73e67c4a..f21656d526 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_eyes.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_eyes.xml
@@ -3,7 +3,9 @@
<panel name="avatar_eye_color_panel">
<texture_picker label="Ãris" name="Iris" tool_tip="Selecionar imagem"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="eyes_main_tab" title="Olhos"/>
- </accordion>
+ <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
index 6b4141e4a7..a94716e659 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml
@@ -4,7 +4,9 @@
<texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="gloves_main_tab" title="Luvas"/>
- </accordion>
+ <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
index b49f5850aa..13f1f892f9 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_hair.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_hair.xml
@@ -3,10 +3,12 @@
<panel name="avatar_hair_color_panel">
<texture_picker label="Texture" name="Texture" tool_tip="Selecionar imagem"/>
</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 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
index dcccf76c26..f555bd9ac7 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml
@@ -5,7 +5,9 @@
<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>
- <accordion name="wearable_accordion">
- <accordion_tab name="jacket_main_tab" title="Jaqueta"/>
- </accordion>
+ <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
index 8cfa6933eb..67c300cc8d 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_pants.xml
@@ -4,7 +4,9 @@
<texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="pants_main_tab" title="Calças"/>
- </accordion>
+ <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
index f56533652d..96a294bc28 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_pick.xml
@@ -1,5 +1,8 @@
<?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>
@@ -22,7 +25,7 @@
</panel>
</scroll_container>
<panel label="bottom_panel" name="bottom_panel">
- <button label="Salvar [WHAT]" name="save_changes_btn"/>
+ <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_shape.xml b/indra/newview/skins/default/xui/pt/panel_edit_shape.xml
index 6a03c2e2ff..504486c3bb 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_shape.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_shape.xml
@@ -9,15 +9,17 @@
<radio_item label="Masculino" name="radio2"/>
</radio_group>
</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 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
index e9d4207e49..fb7c4c080c 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml
@@ -4,7 +4,9 @@
<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>
- <accordion name="wearable_accordion">
- <accordion_tab name="shirt_main_tab" title="Camisa"/>
- </accordion>
+ <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
index 79cb641079..d1d30cf46e 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml
@@ -4,7 +4,9 @@
<texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="shoes_main_tab" title="Sapatos"/>
- </accordion>
+ <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
index e3caf9f6f7..f3d88123f2 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_skin.xml
@@ -5,10 +5,12 @@
<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>
- <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 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
index 00ec0691ea..b67cd53a83 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml
@@ -4,7 +4,9 @@
<texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="skirt_main_tab" title="Saia"/>
- </accordion>
+ <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
index 88abc74716..405568abeb 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_socks.xml
@@ -4,7 +4,9 @@
<texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="socks_main_tab" title="Meias"/>
- </accordion>
+ <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
index c11d800171..23cde50acc 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_tattoo.xml
+++ b/indra/newview/skins/default/xui/pt/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="Tatoo de cabeça" name="Head Tattoo" tool_tip="Clique para escolher uma foto"/>
- <texture_picker label="Tatoo da parte superior do corpo" name="Upper Tattoo" tool_tip="Clique para escolher uma foto"/>
- <texture_picker label="Tatoo da parte inferior do corpo" name="Lower Tattoo" tool_tip="Clique para escolher uma foto"/>
+ <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"/>
</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
index 10c34a1c0a..f858dc0495 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml
@@ -4,7 +4,9 @@
<texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="underpants_main_tab" title="Roupa de baixo"/>
- </accordion>
+ <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
index fb7b919365..9c18fc1d6c 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml
@@ -4,7 +4,9 @@
<texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="undershirt_main_tab" title="Camiseta"/>
- </accordion>
+ <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
index b85d481941..a78539f274 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml
@@ -94,6 +94,11 @@
<panel label="Camisa" name="wearable_type_panel">
<text name="description_text" value="Forma:"/>
</panel>
+ <panel label="gear_buttom_panel" name="gear_buttom_panel">
+ <button name="friends_viewsort_btn" tool_tip="Opções"/>
+ <button name="add_btn" tool_tip="TODO"/>
+ <button name="del_btn" tool_tip="TODO"/>
+ </panel>
<panel name="button_panel">
<button label="Salvar como" name="save_as_button"/>
<button label="Reverter" name="revert_button"/>
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 85488f43af..6060f23bba 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_general.xml
@@ -46,9 +46,12 @@ Para obter mais ajuda, passe o mouse sobre as opções.
<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 a informação do seu grupo é considerada mature." width="170">
- <combo_box.item label="Conteúdo PG" name="pg"/>
+ <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>
<check_box initial_value="true" label="Mostre na busca" name="show_in_group_list" tool_tip="Incluir o grupo nos resultados de busca"/>
</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 2abc8bc7c8..4b5a00c761 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_notices.xml
@@ -19,10 +19,10 @@ Cada grupo pode enviar no máximo 200 avisos/dia
Nenhum resultado foi encontrado.
</text>
<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"/>
+ <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 left="20" name="lbl3">
Assunto:
@@ -43,7 +43,7 @@ Cada grupo pode enviar no máximo 200 avisos/dia
<button label="Enviar" label_selected="Enviar" name="send_notice"/>
<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>
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
index 11e1ba0039..91b7d1b7cd 100644
--- a/indra/newview/skins/default/xui/pt/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/pt/panel_im_control_panel.xml
@@ -13,14 +13,14 @@
<layout_panel name="share_btn_panel">
<button label="Compartilhar" name="share_btn"/>
</layout_panel>
- <layout_panel name="share_btn_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="Desligar" name="end_call_btn"/>
+ <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"/>
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_login.xml b/indra/newview/skins/default/xui/pt/panel_login.xml
index 415451b49f..588b8deaa3 100644
--- a/indra/newview/skins/default/xui/pt/panel_login.xml
+++ b/indra/newview/skins/default/xui/pt/panel_login.xml
@@ -12,13 +12,20 @@
Primeiro nome:
</text>
<line_editor label="Nome" name="first_name_edit" tool_tip="[SECOND_LIFE] First Name"/>
+ <text name="last_name_text">
+ Sobrenome:
+ </text>
<line_editor label="Sobrenome" name="last_name_edit" tool_tip="[SECOND_LIFE] Last Name"/>
+ <text name="password_text">
+ Senha:
+ </text>
<check_box label="Lembrar senha" name="remember_check"/>
<text name="start_location_text">
Começar em:
</text>
<combo_box name="start_location_combo">
- <combo_box.item label="Minha casa" name="MyHome"/>
+ <combo_box.item label="Última posição" name="MyLastLocation"/>
+ <combo_box.item label="Meu início" name="MyHome"/>
</combo_box>
<button label="conectar" name="connect_btn"/>
</layout_panel>
@@ -26,6 +33,9 @@
<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>
diff --git a/indra/newview/skins/default/xui/pt/panel_main_inventory.xml b/indra/newview/skins/default/xui/pt/panel_main_inventory.xml
index f64b9f319f..104c3bface 100644
--- a/indra/newview/skins/default/xui/pt/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/panel_main_inventory.xml
@@ -1,18 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Coisas" name="main inventory panel">
- <panel.string name="Title">
- Coisas
+ <panel.string name="ItemcountFetching">
+ Reunindo [ITEM_COUNT] itens ... [FILTER]
</panel.string>
- <filter_editor label="Filtro" 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>
- <panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/>
- <button name="add_btn" tool_tip="Adicionar novo item"/>
- <dnd_button name="trash_btn" tool_tip="Remover item selecionado"/>
- </panel>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] itens [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ Itens:
+ </text>
<menu_bar name="Inventory Menu">
<menu label="Arquivo" name="File">
<menu_item_call label="Abrir" name="Open"/>
@@ -48,7 +44,7 @@
<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 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"/>
@@ -61,4 +57,14 @@
<menu_item_check label="Pastas do sistema no topo" name="System Folders To Top"/>
</menu>
</menu_bar>
+ <filter_editor label="Filtro" 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>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/>
+ <button name="add_btn" tool_tip="Adicionar novo item"/>
+ <dnd_button name="trash_btn" tool_tip="Remover item selecionado"/>
+ </panel>
</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
index 9815b8d0b4..43c0820036 100644
--- a/indra/newview/skins/default/xui/pt/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/pt/panel_media_settings_general.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Público geral" name="Media Settings General">
+<panel label="Geral" name="Media Settings General">
<text name="home_label">
Página web:
</text>
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
index 009dd0d752..55226db274 100644
--- a/indra/newview/skins/default/xui/pt/panel_media_settings_permissions.xml
+++ b/indra/newview/skins/default/xui/pt/panel_media_settings_permissions.xml
@@ -11,10 +11,19 @@
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_navigation_bar.xml b/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml
index 511c4426bb..01930bf3b3 100644
--- a/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml
@@ -3,7 +3,7 @@
<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 minha casa"/>
+ <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"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_media.xml b/indra/newview/skins/default/xui/pt/panel_nearby_media.xml
index a81d3e19f8..8d08177eed 100644
--- a/indra/newview/skins/default/xui/pt/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/pt/panel_nearby_media.xml
@@ -1,5 +1,8 @@
<?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>
@@ -16,13 +19,15 @@
<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_less_btn" tool_tip="Controles avançados"/>
+ <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"/>
@@ -34,7 +39,7 @@
<panel>
<layout_stack name="media_controls">
<layout_panel name="stop">
- <button name="stop_btn" tool_tip="Para mídia selecionada"/>
+ <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"/>
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..3dc8b4cc75
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_outfit_edit.xml
@@ -0,0 +1,48 @@
+<?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"/>
+ <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"/>
+ <button label="Editar" name="edit_wearable_btn"/>
+ <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">
+ <scroll_list name="look_items_list">
+ <scroll_list.columns label="Ver item" name="look_item"/>
+ <scroll_list.columns label="Ordenar itens" name="look_item_sort"/>
+ </scroll_list>
+ <panel label="bottom_panel" name="edit_panel"/>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel">
+ <filter_editor label="Filtro" name="look_item_filter"/>
+ <layout_stack name="filter_panels">
+ <layout_panel label="Painel de controle de MIs" name="filter_button_panel">
+ <text name="add_to_outfit_label" value="Adicionar ao look:"/>
+ <button label="O" name="filter_button"/>
+ </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="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
index 8d648a98fa..c8f33f85a9 100644
--- a/indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Coisas" name="Outfits">
<tab_container name="appearance_tabs">
- <inventory_panel label="MEUS LOOKS" name="outfitslist_tab"/>
+ <panel label="MEUS LOOKS" name="outfitslist_tab"/>
<inventory_panel label="EM USO" name="cof_tab"/>
</tab_container>
<panel name="bottom_panel">
@@ -9,6 +9,6 @@
<dnd_button name="trash_btn" tool_tip="Remover item selecionado"/>
<button label="Salvar este look" name="make_outfit_btn" tool_tip="Salvar aparência como um look"/>
<button label="Vestir" name="wear_btn" tool_tip="Vestir look selecionado"/>
- <button label="M" name="look_edit_btn"/>
+ <button label="Editar look" name="edit_current_outfit_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_people.xml b/indra/newview/skins/default/xui/pt/panel_people.xml
index 5061788757..17f5b6cbac 100644
--- a/indra/newview/skins/default/xui/pt/panel_people.xml
+++ b/indra/newview/skins/default/xui/pt/panel_people.xml
@@ -1,12 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Side tray panel -->
<panel label="Pessoas" name="people_panel">
- <string name="no_people" value="Nenhuma pessoa"/>
- <string name="no_one_near" value="Ninguém por perto"/>
+ <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 fazer uma [secondlife:///app/search/groups Busca]."/>
+ <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 fazer uma [secondlife:///app/search/groups Busca]."/>
<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 fazer uma [secondlife:///app/search/groups Busca].
+ </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 fazer uma [secondlife:///app/search/groups Busca]."/>
+ <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">
@@ -25,10 +36,6 @@
<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>
- <text name="no_friends_msg">
- Para adicionar amigos, use a [secondlife:///app/search/people busca de pessoas] ou clique em um usuário para adicioná-lo.
-Para conhecer mais gente, use [secondlife:///app/worldmap o Mapa].
- </text>
</panel>
<panel label="MEUS GRUPOS" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
@@ -45,13 +52,13 @@ Para conhecer mais gente, use [secondlife:///app/worldmap o Mapa].
</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"/>
- <button label="MI" name="im_btn" tool_tip="Abrir sessão de mensagem instantânea"/>
- <button label="Chamada" name="call_btn" tool_tip="Ligar para este residente"/>
- <button label="Compartilhar" name="share_btn"/>
- <button label="Teletransporte" name="teleport_btn" tool_tip="Oferecer teletransporte"/>
+ <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" 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="abrir sessão de bate- papo"/>
+ <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_place_profile.xml b/indra/newview/skins/default/xui/pt/panel_place_profile.xml
index 453c56d280..03f997f31b 100644
--- a/indra/newview/skins/default/xui/pt/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/pt/panel_place_profile.xml
@@ -6,7 +6,7 @@
<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="Histórico de teletransportes"/>
+ <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)"/>
@@ -51,12 +51,12 @@
<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="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="Push:"/>
+ <text name="push_label" value="Empurrar:"/>
<text name="push_value" value="Desligar"/>
<text name="build_label" value="Construir:"/>
<text name="build_value" value="Ligar"/>
@@ -70,10 +70,17 @@
<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>
@@ -93,7 +100,7 @@
<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="Juntar/subdividir:"/>
+ <text name="subdivide_label" value="Capacidade de juntar/subdividir:"/>
<text name="resale_label" value="Revenda:"/>
<text name="sale_to_label" value="À venda para:"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_places.xml b/indra/newview/skins/default/xui/pt/panel_places.xml
index d9045e1a37..f7b6f54dea 100644
--- a/indra/newview/skins/default/xui/pt/panel_places.xml
+++ b/indra/newview/skins/default/xui/pt/panel_places.xml
@@ -1,7 +1,7 @@
<?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="HISTÓRICO DE TELETRANSPORTES"/>
+ <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"/>
@@ -11,5 +11,6 @@
<button label="Salvar" name="save_btn"/>
<button label="Cancelar" name="cancel_btn"/>
<button label="Fechar" name="close_btn"/>
+ <button label="Perfil" name="profile_btn"/>
</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 7ed64404e6..6f2cae0476 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
@@ -3,27 +3,34 @@
<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>
- <check_box label="Construir/Editar" 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="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 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 quando estiver falando" name="enable_lip_sync"/>
+ <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="Escolha a cor do balão de bate-papo"/>
+ <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 enquanto o botão estiver pressionado."/>
- <line_editor label="Botao apertar e falar" name="modifier_combo"/>
- <button label="Definir chave" name="set_voice_hotkey_button"/>
+ <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_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
index d9b18724e2..e566fde27c 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
@@ -1,10 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Chat" name="chat">
+ <text name="font_size">
+ Tamanho da fonte:
+ </text>
<radio_group name="chat_font_size">
<radio_item label="Pequeno" name="radio" value="0"/>
- <radio_item label="Média" name="radio2" value="1"/>
+ <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">
Eu
@@ -38,8 +44,14 @@
URLs
</text>
<check_box initial_value="true" label="Executar animação digitada quando estiver conversando" name="play_typing_animation"/>
- <check_box label="Envie MIs por email quando eu estiver desconectado" name="send_im_to_email"/>
- <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)">
+ <check_box label="Enviar MIs por email se estiver desconectado" name="send_im_to_email"/>
+ <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>
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 7a3e69c988..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,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Geral" name="general_panel">
<text name="language_textbox">
- Linguagem:
+ Idioma:
</text>
<combo_box name="language_combobox">
<combo_box.item label="Padrão" name="System Default Language"/>
@@ -17,23 +17,23 @@
<combo_box.item label="日本語 (Japonês) - Beta" name="(Japanese)"/>
</combo_box>
<text name="language_textbox2">
- (Reinicie para mostrar o novo idioma)
+ (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 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="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="start_location_textbox">
- Ponto de partida:
+ Posição inicial:
</text>
<combo_box name="start_location_combo">
- <combo_box.item label="Minha Última Localidade" name="MyLastLocation" tool_tip="Por padrão, registrar na minha última localidade."/>
- <combo_box.item label="Minha Casa" name="MyHome" tool_tip="Como padrão, registrar na minha casa."/>
+ <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">
@@ -45,7 +45,7 @@
<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="Nomes pequenos" name="small_avatar_names_checkbox"/>
+ <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">
Meus efeitos:
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 121272bf6c..eb38323940 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
@@ -48,12 +48,12 @@ rápido
<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:" label_width="150" name="DrawDistance" width="255"/>
+ <slider label="Distancia de desenho:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
</text>
- <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"/>
+ <slider label="Contador máx. de partículas:" name="MaxParticleCount"/>
+ <slider label="Qualidade de Pós-processamento:" name="RenderPostProcess"/>
<text name="MeshDetailText">
Detalhes de Malha:
</text>
@@ -94,13 +94,13 @@ rápido
<text name="TerrainDetailText">
Detalhe do Terreno:
</text>
- <radio_group left_delta="45" name="TerrainDetailRadio" width="276">
+ <radio_group left_delta="45" name="TerrainDetailRadio">
<radio_item label="Baixo" name="0"/>
<radio_item label="Alto" name="2"/>
</radio_group>
</panel>
<button label="Aplicar" label_selected="Aplicar" name="Apply"/>
- <button label="Redefinir" left="110" name="Defaults" width="190"/>
+ <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_setup.xml b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
index f220bb156f..f03063d05b 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
@@ -28,19 +28,22 @@
<text name="Cache location">
Localização do cache:
</text>
- <button label="Navegar" label_selected="Navegar" name="set_cache"/>
+ <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 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="0"/>
<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="verdadeiro" label="Habilitar plugins" name="browser_plugins_enabled"/>
+ <check_box initial_value="verdadeiro" label="Aceitar cookies" name="cookies_enabled"/>
+ <check_box initial_value="verdadeiro" 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="Número da porta:" name="web_proxy_port"/>
+ <spinner label="Porta:" name="web_proxy_port"/>
</panel>
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 2119a06e55..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:
@@ -27,14 +27,14 @@
Opções:
</text>
<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="Retornar apenas objetos que estejam na terra pertencente a alguém"/>
- <check_box label="Em todas as regiões 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 label="Pegar os principais colidentes..." name="top_colliders_btn" tool_tip="Lista dos objetos que experimentam as mais potenciais colisões" width="280"/>
+ <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="Pegar Principais Scripts..." name="top_scripts_btn" tool_tip="Lista de objetos gastando mais tempo rodando scripts" width="280"/>
+ <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="Dar 2 minutos de contagem regressiva e reiniciar a região"/>
+ <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 0f173ab21a..e5d394865c 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_estate.xml
@@ -39,7 +39,7 @@
</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
index 89fcb05658..534b2826af 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_general_layout.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_general_layout.xml
@@ -18,12 +18,12 @@
<text name="region_type">
(Desconhecido)
</text>
- <check_box label="Bloquear terraplanagem" name="block_terraform_check"/>
+ <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 junção e divisão de terrenos" name="allow_parcel_changes_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"/>
@@ -36,7 +36,7 @@
<combo_box.item label="Geral" name="PG"/>
</combo_box>
<button label="Aplicar" name="apply_btn"/>
- <button label="Teletransportar para início..." name="kick_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"/>
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 7f37919af2..35928ccc67 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_texture.xml
@@ -25,16 +25,16 @@
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"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_side_tray.xml b/indra/newview/skins/default/xui/pt/panel_side_tray.xml
index 09ac074b5a..1a424fb7f1 100644
--- a/indra/newview/skins/default/xui/pt/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/pt/panel_side_tray.xml
@@ -3,27 +3,27 @@
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="Casa." name="sidebar_home" tab_title="Home">
- <panel label="casa" name="panel_home"/>
+ <sidetray_tab description="Início" name="sidebar_home" tab_title="Início">
+ <panel label="Início" name="panel_home"/>
</sidetray_tab>
- <sidetray_tab description="Editar seu perfil público e destaques ." name="sidebar_me" tab_title="My Profile">
+ <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="People">
+ <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="Places">
+ <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="Busca no seu inventário." name="sidebar_inventory" tab_title="My Inventory">
+ <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 visual atual." name="sidebar_appearance" tab_title="My Appearance">
+ <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_world_map.xml b/indra/newview/skins/default/xui/pt/panel_world_map.xml
index 584ef8a666..accab068fd 100644
--- a/indra/newview/skins/default/xui/pt/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/pt/panel_world_map.xml
@@ -30,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/sidepanel_inventory.xml b/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml
index 75b737b8bd..f634236cd2 100644
--- a/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml
@@ -3,6 +3,7 @@
<panel label="" name="sidepanel__inventory_panel">
<panel name="button_panel">
<button label="Perfil" name="info_btn"/>
+ <button label="Compartilhar" name="share_btn"/>
<button label="Vestir" name="wear_btn"/>
<button label="Tocar" name="play_btn"/>
<button label="Teletransportar" name="teleport_btn"/>
diff --git a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml
index 7981cd106f..9193730018 100644
--- a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml
@@ -38,7 +38,7 @@
</panel.string>
<text name="title" value="Perfil do objeto"/>
<text name="where" value="(inworld)"/>
- <panel label="">
+ <panel label="" name="properties_panel">
<text name="Name:">
Nome:
</text>
@@ -54,12 +54,15 @@
<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."/>
+ <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>
@@ -121,5 +124,6 @@
<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 195345abc0..51b6581d42 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -8,16 +8,31 @@
SECOND LIFE
</string>
<string name="SUPPORT_SITE">
- Portal de Apoio do Second Life
+ Portal de Supporte Second Life
</string>
<string name="StartupDetectingHardware">
Detectando hardware...
</string>
<string name="StartupLoading">
- Carregando
+ 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...
@@ -29,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...
@@ -47,10 +62,10 @@
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...
@@ -59,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...
@@ -74,7 +89,10 @@
Baixando roupas...
</string>
<string name="LoginFailedNoNetwork">
- Erro de Rede: Não foi possível estabelecer a conexão, verifique sua conexão de rede.
+ 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
@@ -85,6 +103,24 @@
<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>
@@ -107,22 +143,22 @@
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:
@@ -131,14 +167,32 @@
Apenas um item único pode ser arrastado para este local
</string>
<string name="TooltipHttpUrl">
- Clique para ver essa página web
+ Clique para ver a página web
</string>
<string name="TooltipSLURL">
- Clique para ver a informação desta localização
+ 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>
@@ -146,7 +200,7 @@
Clique para ver a descrição deste evento
</string>
<string name="TooltipClassifiedUrl">
- Clique para ver este classificado
+ Clique para ver este anúncio
</string>
<string name="TooltipParcelUrl">
Clique para ver a descrição desta parcela
@@ -161,21 +215,43 @@
Clique para ver esta localização no mapa
</string>
<string name="TooltipSLAPP">
- Clique para ativar no secondlife:// commando
+ 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>
@@ -201,7 +277,7 @@
Buscando...
</string>
<string name="ReleaseNotes">
- Notas de Distribuição
+ Notas de versão
</string>
<string name="LoadingData">
Carregando...
@@ -215,6 +291,9 @@
<string name="GroupNameNone">
(nenhum)
</string>
+ <string name="AvalineCaller">
+ Interlocutor Avaline [ORDER]
+ </string>
<string name="AssetErrorNone">
Nenhum erro
</string>
@@ -270,7 +349,7 @@
objeto
</string>
<string name="note card">
- notecard
+ anotação
</string>
<string name="folder">
pasta
@@ -320,6 +399,9 @@
<string name="symbolic link">
link
</string>
+ <string name="symbolic folder link">
+ link da pasta
+ </string>
<string name="AvatarAway">
Distante
</string>
@@ -354,7 +436,7 @@
Entediado
</string>
<string name="anim_bow">
- Saudar curvando
+ Reverência
</string>
<string name="anim_clap">
Aplaudir
@@ -414,10 +496,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
@@ -438,7 +520,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
@@ -453,10 +535,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
@@ -495,16 +577,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
@@ -561,7 +643,7 @@
grita:
</string>
<string name="ringing">
- Conectando à conversa de Voz no mundo
+ Conectando à conversa de voz no mundo
</string>
<string name="connected">
Conectado
@@ -615,13 +697,13 @@
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
@@ -633,7 +715,7 @@
(desconhecido)
</string>
<string name="all_files">
- Todos os Arquivos
+ Todos os arquivos
</string>
<string name="sound_files">
Sons
@@ -657,10 +739,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
@@ -669,25 +751,25 @@
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 não away
+ deixar como ausente
</string>
<string name="AvatarSetAway">
- deixar como Away
+ deixar como ausente
</string>
<string name="AvatarSetNotBusy">
- deixar como não Ocupado
+ deixar como não ocupado
</string>
<string name="AvatarSetBusy">
- Deixar como Busy
+ Deixar como ocupado
</string>
<string name="shape">
Silhueta
@@ -705,7 +787,7 @@
Camisa
</string>
<string name="pants">
- calças
+ Calças
</string>
<string name="shoes">
Sapatos
@@ -720,22 +802,25 @@
Luvas
</string>
<string name="undershirt">
- camiseta
+ Camiseta
</string>
<string name="underpants">
- roupa debaixo
+ Roupa de baixo
</string>
<string name="skirt">
- saia
+ Saia
</string>
<string name="alpha">
Alpha
</string>
<string name="tattoo">
- Tattoo
+ Tatuagem
</string>
<string name="invalid">
- inválido
+ Inválido
+ </string>
+ <string name="NewWearable">
+ Novo [WEARABLE_ITEM]
</string>
<string name="next">
Próximo
@@ -768,7 +853,7 @@
Oferta de teletransporte
</string>
<string name="StartUpNotifications">
- [%d] Novas notificações chegaram enquanto você estava fora...
+ Novas notificações chegaram enquanto você estava fora...
</string>
<string name="OverflowInfoChannelString">
Você tem mais [%d] notificações
@@ -804,7 +889,7 @@
Pressione ESC para retornar para visão do mundo
</string>
<string name="InventoryNoMatchingItems">
- Nenhum item correspondente foi encontrado no inventário. Tente fazer uma [secondlife:///app/search/groups &quot;Busca&quot;].
+ Não encontrou o que procura? Tente fazer uma [secondlife:///app/search/groups Busca].
</string>
<string name="FavoritesNoMatchingItems">
Arraste um marco para adicioná-lo aos seus favoritos.
@@ -825,32 +910,33 @@
Nenhum conteúdo
</string>
<string name="WornOnAttachmentPoint" value="(vestido em [ATTACHMENT_POINT])"/>
- <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="Aceno"/>
+ <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 tudo &gt;&gt;"/>
+ <string name="ViewAllGestures" value="Ver todos&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="Landmarks,"/>
- <string name="Notecards" value="Notecards,"/>
+ <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="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="Since Logoff" value="- Desde desligado"/>
<string name="InvFolder My Inventory">
- Meu Inventorio
+ Meu inventário
</string>
<string name="InvFolder My Favorites">
- Meus Favoritos
+ Meus favoritos
</string>
<string name="InvFolder Library">
Biblioteca
@@ -862,10 +948,10 @@
Sons
</string>
<string name="InvFolder Calling Cards">
- Cartões de Visitas
+ Cartões de visitas
</string>
<string name="InvFolder Landmarks">
- Landmarks
+ Marcos
</string>
<string name="InvFolder Scripts">
Scripts
@@ -877,31 +963,31 @@
Objetos
</string>
<string name="InvFolder Notecards">
- Notecards
+ Anotações
</string>
<string name="InvFolder New Folder">
- Nova Pasta
+ Nova pasta
</string>
<string name="InvFolder Inventory">
Inventário
</string>
<string name="InvFolder Uncompressed Images">
- Imagens Descompactadas
+ Imagens descompactadas
</string>
<string name="InvFolder Body Parts">
- Partes do Corpo
+ Corpo
</string>
<string name="InvFolder Trash">
Lixo
</string>
<string name="InvFolder Photo Album">
- Ãlbum de Fotografias
+ Ãlbum de fotografias
</string>
<string name="InvFolder Lost And Found">
Achados e Perdidos
</string>
<string name="InvFolder Uncompressed Sounds">
- Sons Descompactados
+ Sons descompactados
</string>
<string name="InvFolder Animations">
Animações
@@ -913,10 +999,13 @@
Favoritos
</string>
<string name="InvFolder Current Outfit">
- Vestimanta Atual
+ Look atual
</string>
<string name="InvFolder My Outfits">
- Minhas Vestimentas
+ Meus looks
+ </string>
+ <string name="InvFolder Accessories">
+ Acessórios
</string>
<string name="InvFolder Friends">
Amigos
@@ -988,7 +1077,7 @@
Espinha
</string>
<string name="Pelvis">
- Pelvis
+ Pélvis
</string>
<string name="Mouth">
Boca
@@ -1045,10 +1134,10 @@
Estômago
</string>
<string name="Left Pec">
- Pec esquerdo
+ Peitoral E
</string>
<string name="Right Pec">
- Pec direito
+ Peitoral D
</string>
<string name="YearsMonthsOld">
[AGEYEARS] [AGEMONTHS] de idade
@@ -1126,19 +1215,19 @@
Empregado da Linden Lab
</string>
<string name="PaymentInfoUsed">
- Info de Pagamento usada
+ Dados de pagamento usados
</string>
<string name="PaymentInfoOnFile">
- Info de Pagamento no Arquivo
+ Dados de pagamento fornecidos
</string>
<string name="NoPaymentInfoOnFile">
- Nenhuma Info de Pagamento no Arquivo
+ Nenhum dado de pagamento
</string>
<string name="AgeVerified">
- Idade-verificada
+ Idade comprovada
</string>
<string name="NotAgeVerified">
- Idade não-verificada
+ Idade não comprovada
</string>
<string name="Center 2">
Centro 2
@@ -1165,16 +1254,16 @@
Inferior direito
</string>
<string name="CompileQueueDownloadedCompiling">
- Downloaded, agora compilando
+ Baixado, agora compilando
</string>
<string name="CompileQueueScriptNotFound">
Script não encontrado no servidor.
</string>
<string name="CompileQueueProblemDownloading">
- Problema no download
+ Problema no download
</string>
<string name="CompileQueueInsufficientPermDownload">
- Permissões insuficientes para fazer o download do script.
+ Permissões insuficientes para fazer o download do script.
</string>
<string name="CompileQueueInsufficientPermFor">
Permissões insuficientes para
@@ -1183,7 +1272,7 @@
Falha desconhecida para download
</string>
<string name="CompileQueueTitle">
- Progresso do Recompilamento
+ Progresso do recompilamento
</string>
<string name="CompileQueueStart">
recompilar
@@ -1192,7 +1281,7 @@
Reset Progresso
</string>
<string name="ResetQueueStart">
- reset
+ Zerar
</string>
<string name="RunQueueTitle">
Definir funcionamento do progresso
@@ -1216,7 +1305,7 @@
Salvo.
</string>
<string name="ObjectOutOfRange">
- Script (objecto fora de alcance)
+ Script (objeto fora de alcance)
</string>
<string name="GodToolsObjectOwnedBy">
Objeto [OBJECT] de propriedade de [OWNER]
@@ -1244,10 +1333,10 @@
Total
</string>
<string name="NoGroupDataFound">
- Não ha dados de grupo para o grupo
+ Não há dados de grupo
</string>
<string name="IMParentEstate">
- propriedade dos pais
+ Propriedade-pai
</string>
<string name="IMMainland">
continente
@@ -1435,6 +1524,12 @@
<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>
@@ -1448,14 +1543,12 @@
(grupo)
</string>
<string name="RegionNoCovenant">
- Não ha Contrato fornecido para essa Região.
+ Não foi definido um contrato para essa região.
</string>
<string name="RegionNoCovenantOtherOwner">
- Não ha Contrato fornecido 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">
- Última modificação:
+ 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">
@@ -1471,7 +1564,7 @@
(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.
+ 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
@@ -1492,19 +1585,19 @@
possuído pelo grupo
</string>
<string name="InvOfferOwnedByUnknownGroup">
- possuído por um grupo desconhecido
+ de um grupo desconhecido
</string>
<string name="InvOfferOwnedBy">
- possuído por
+ de
</string>
<string name="InvOfferOwnedByUnknownUser">
- possuído por usuário desconhecido
+ de usuário desconhecido
</string>
<string name="InvOfferGaveYou">
deu a você
</string>
<string name="InvOfferYouDecline">
- Você declina
+ Você recusa
</string>
<string name="InvOfferFrom">
de
@@ -1531,7 +1624,7 @@
pagou prêmio para o evento
</string>
<string name="GroupMoneyBalance">
- Balanço
+ Saldo
</string>
<string name="GroupMoneyCredits">
Créditos
@@ -1549,7 +1642,10 @@
Cancelar
</string>
<string name="UploadingCosts">
- Uploading [%s] custos
+ Carregar [NAME] custa L$ [AMOUNT]
+ </string>
+ <string name="BuyingCosts">
+ Isso custa L$ [AMOUNT]
</string>
<string name="UnknownFileExtension">
Extensão de arquivo desconhecida [.%s]
@@ -1559,10 +1655,10 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
Bloquear
</string>
<string name="AddLandmarkNavBarMenu">
- Adicionar Landmark...
+ Adicionar marco...
</string>
<string name="EditLandmarkNavBarMenu">
- Editar Landmark...
+ Editar marco...
</string>
<string name="accel-mac-control">
⌃
@@ -1670,7 +1766,7 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
Locação Linden
</string>
<string name="Adult">
- Adult
+ Adulto
</string>
<string name="Arts&amp;Culture">
Artes e Cultura
@@ -1682,13 +1778,13 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
Educacional
</string>
<string name="Gaming">
- Jogos
+ Games
</string>
<string name="Hangout">
Moradia
</string>
<string name="Newcomer Friendly">
- Amigável a Novos Usuários
+ Para recém-chegados
</string>
<string name="Parks&amp;Nature">
Parques &amp; Natureza
@@ -1730,10 +1826,10 @@ 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
+ Erro fatal
</string>
<string name="MBRequiresAltiVec">
- [APP_NAME] exige um processador com AltiVec (G4 ou superior).
+ [APP_NAME] exige processador com AltiVec (G4 ou superior).
</string>
<string name="MBAlreadyRunning">
[APP_NAME] já está em execução.
@@ -1741,7 +1837,7 @@ 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. Você gostaria de enviar um relatório de falha?
+ [APP_NAME] parece ter congelado ou falhado na execução anterior. Enviar relatório de falha?
</string>
<string name="MBAlert">
Alerta
@@ -1795,7 +1891,7 @@ Também não se esqueça de definir seu monitor para True Color (32-bit), em pai
Se você continuar a receber esta mensagem, contate o [SUPPORT_SITE].
</string>
<string name="MBPixelFmtSetErr">
- ão é possível definir o formato de pixel
+ Não é possível definir o formato de pixel
</string>
<string name="MBGLContextErr">
Não é possível criar o contexto de renderização GL
@@ -1809,7 +1905,7 @@ Se você continuar a receber esta mensagem, contate o [SUPPORT_SITE].
If you continue to receive this message, contact the [SUPPORT_SITE].
</string>
<string name="5 O&apos;Clock Shadow">
- Sombra descuidada
+ Barba por fazer
</string>
<string name="All White">
Todo branco
@@ -1818,10 +1914,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Olhos de Anime
</string>
<string name="Arced">
- arqueado
+ Arqueados
</string>
<string name="Arm Length">
- Comprimento do Braço
+ Comprimento do braço
</string>
<string name="Attached">
Anexado
@@ -1839,7 +1935,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Franja
</string>
<string name="Beady Eyes">
- Olhos malévolos
+ Olhos pequenos
</string>
<string name="Belly Size">
Tamanho da barriga
@@ -1848,7 +1944,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Grande
</string>
<string name="Big Butt">
- Traseiro Grande
+ Bunda grande
</string>
<string name="Big Hair Back">
Cabelo volumoso: Trás
@@ -1857,7 +1953,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Cabelo volumoso: Frente
</string>
<string name="Big Hair Top">
- cabelo volumoso: Topo
+ Cabelo volumoso: Topo
</string>
<string name="Big Head">
cabeça grande
@@ -1866,7 +1962,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Peitorais grandes
</string>
<string name="Big Spikes">
- espinhos grandes
+ Pontas grandes
</string>
<string name="Black">
Negro
@@ -1875,40 +1971,40 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Loiro
</string>
<string name="Blonde Hair">
- Cabelo Loiro
+ Cabelo loiro
</string>
<string name="Blush">
Blush
</string>
<string name="Blush Color">
- cor do Blush
+ Cor do blush
</string>
<string name="Blush Opacity">
- Opacidade do Blush
+ Opacidade do blush
</string>
<string name="Body Definition">
- definição do Corpo
+ Definição do corpo
</string>
<string name="Body Fat">
- Gordura corporal
+ Gordura
</string>
<string name="Body Freckles">
- Sardas do corpo
+ Sardas
</string>
<string name="Body Thick">
Corpo cheio
</string>
<string name="Body Thickness">
- Espessura do corpo
+ Ossatura
</string>
<string name="Body Thin">
Corpo magro
</string>
<string name="Bow Legged">
- pernas arqueadas
+ Pernas arqueadas
</string>
<string name="Breast Buoyancy">
- Flexibilidade dos seios
+ Caimento dos seios
</string>
<string name="Breast Cleavage">
Separação dos seios
@@ -1923,7 +2019,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Largo
</string>
<string name="Brow Size">
- tamanho da sobrancelha
+ Tamanho da sobrancelha
</string>
<string name="Bug Eyes">
Olhos saltados
@@ -1947,25 +2043,25 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Tamanho do traseiro
</string>
<string name="bustle skirt">
- Movimentação de saia
+ Saia armada
</string>
<string name="no bustle">
- Sem movimento
+ Saia reta
</string>
<string name="more bustle">
- Mais movimento
+ Mais
</string>
<string name="Chaplin">
Chaplin
</string>
<string name="Cheek Bones">
- Maças do rosto
+ Maçãs do rosto
</string>
<string name="Chest Size">
Tamanho do peito
</string>
<string name="Chin Angle">
- ângulo do queixo
+ Ângulo do queixo
</string>
<string name="Chin Cleft">
Fissura do queixo
@@ -2013,7 +2109,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Direita fechada
</string>
<string name="Coin Purse">
- Pubis
+ Pouco volume
</string>
<string name="Collar Back">
Colarinho posterior
@@ -2034,7 +2130,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Nariz torto
</string>
<string name="Cuff Flare">
- bainha larga
+ Bainha larga
</string>
<string name="Dark">
Escuro
@@ -2043,13 +2139,13 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Verde escuro
</string>
<string name="Darker">
- mais escuro
+ Mais escuro
</string>
<string name="Deep">
Profundidade
</string>
<string name="Default Heels">
- Salto Padrão
+ Salto padrão
</string>
<string name="Dense">
Densidade
@@ -2061,10 +2157,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Curvado para baixo
</string>
<string name="Duffle Bag">
- pubis
+ Mais volume
</string>
<string name="Ear Angle">
- ângulo da orelha
+ Ângulo da orelha
</string>
<string name="Ear Size">
Tamanho da orelha
@@ -2091,7 +2187,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Abertura dos olhos
</string>
<string name="Eye Pop">
- Olho Saltado
+ Olho saltado
</string>
<string name="Eye Size">
Tamanho dos olhos
@@ -2103,7 +2199,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Arco da sobrancelha
</string>
<string name="Eyebrow Density">
- densidade da sobrancelha
+ Densidade da sobrancelha
</string>
<string name="Eyebrow Height">
Altura da sobrancelha
@@ -2166,7 +2262,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Tamanho dos pés
</string>
<string name="Forehead Angle">
- ângulo da testa
+ Ângulo da testa
</string>
<string name="Forehead Heavy">
Testa pronunciada
@@ -2199,7 +2295,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Dedos da luva
</string>
<string name="Glove Length">
- comprimento das luvas
+ Comprimento das luvas
</string>
<string name="Hair">
Cabelo
@@ -2238,7 +2334,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Tamanho das mãos
</string>
<string name="Handlebars">
- bigode
+ Bigode
</string>
<string name="Head Length">
Comprimento da cabeça
@@ -2262,7 +2358,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Altura
</string>
<string name="High">
- alto
+ Alto
</string>
<string name="High Heels">
Salto alto
@@ -2271,7 +2367,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Maxilar alto
</string>
<string name="High Platforms">
- Plataformas alta
+ Plataformas altas
</string>
<string name="High and Tight">
Alto e justo
@@ -2307,7 +2403,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Comprimento da blusa
</string>
<string name="Jacket Wrinkles">
- Dobras da Blusa
+ Dobras da jaqueta
</string>
<string name="Jaw Angle">
Ângulo da mandíbula
@@ -2349,7 +2445,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Menos
</string>
<string name="Less Body Fat">
- Menos gordura corporal
+ Menos gordura
</string>
<string name="Less Curtains">
Menos barba
@@ -2364,7 +2460,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Menos gravidade
</string>
<string name="Less Love">
- Menos cintura
+ Menos excesso
</string>
<string name="Less Muscles">
Menos músculos
@@ -2397,7 +2493,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Fenda dos lábios
</string>
<string name="Lip Cleft Depth">
- Prfundidade da fenda dos lábios
+ Profundidade da fenda dos lábios
</string>
<string name="Lip Fullness">
Volume dos lábios
@@ -2454,37 +2550,37 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Pantalonas
</string>
<string name="Loose Shirt">
- Saia folgada
+ Camisa folgada
</string>
<string name="Loose Sleeves">
- Manga longa
+ Mangas folgadas
</string>
<string name="Love Handles">
Pneu
</string>
<string name="Low">
- baixo
+ Baixo
</string>
<string name="Low Heels">
Salto baixo
</string>
<string name="Low Jaw">
- maxilar baixo
+ Maxilar baixo
</string>
<string name="Low Platforms">
Plataformas baixas
</string>
<string name="Low and Loose">
- baixo e solto
+ Baixo e solto
</string>
<string name="Lower">
- diminuir
+ Mais baixo
</string>
<string name="Lower Bridge">
- nariz baixo
+ Mais baixa
</string>
<string name="Lower Cheeks">
- bochechas abaixadas
+ Bochechas abaixadas
</string>
<string name="Male">
Masculino
@@ -2499,7 +2595,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Mais blush
</string>
<string name="More Body Fat">
- Mais gordura corporal
+ Mais gordura
</string>
<string name="More Curtains">
Mais barba
@@ -2553,7 +2649,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Mais vertical
</string>
<string name="More Volume">
- Mais Volume
+ Mais volume
</string>
<string name="More soul">
Mais alma
@@ -2604,16 +2700,16 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Espessura do pescoço
</string>
<string name="No Blush">
- Sem Blush
+ Sem blush
</string>
<string name="No Eyeliner">
Sem delineador
</string>
<string name="No Eyeshadow">
- Sem Sombra dos olhos
+ Sem sombra
</string>
<string name="No Lipgloss">
- Sem brilho labial
+ Sem brilho
</string>
<string name="No Lipstick">
Sem batom
@@ -2628,7 +2724,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Sem vermelho
</string>
<string name="No Spikes">
- Sem espinhos
+ Sem pontas
</string>
<string name="No White">
Sem branco
@@ -2709,10 +2805,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Sombra externa
</string>
<string name="Overbite">
- Overbite
+ Má oclusão
</string>
<string name="Package">
- Pubis
+ Púbis
</string>
<string name="Painted Nails">
Unhas pintadas
@@ -2724,7 +2820,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Cavalo da calça
</string>
<string name="Pants Fit">
- Pants Fit
+ Caimento das calças
</string>
<string name="Pants Length">
Comprimento das calças
@@ -2739,10 +2835,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Parte
</string>
<string name="Part Bangs">
- Parts da franja
+ Divisão da franja
</string>
<string name="Pectorals">
- Peitoral
+ Peitorais
</string>
<string name="Pigment">
Pigmento
@@ -2787,7 +2883,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Pálpebras inchadas
</string>
<string name="Rainbow Color">
- Cor do arco iris
+ Cor do arco íris
</string>
<string name="Red Hair">
Cabelo ruivo
@@ -2814,7 +2910,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Cabelo desalinhado
</string>
<string name="Saddle Bags">
- Saddle Bags
+ Culote
</string>
<string name="Scrawny Leg">
Pernas magricelas
@@ -2823,7 +2919,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Separar
</string>
<string name="Shallow">
- raso
+ Raso
</string>
<string name="Shear Back">
Trás rente
@@ -2847,22 +2943,22 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Rente frente
</string>
<string name="Shift Left">
- Deslocar à esquerda
+ Deslocar p/ esquerda
</string>
<string name="Shift Mouth">
Deslocar boca
</string>
<string name="Shift Right">
- Deslocar direita
+ Deslocar p/ direita
</string>
<string name="Shirt Bottom">
- Deslocar inferior
+ Barra da camisa
</string>
<string name="Shirt Fit">
- Deslocar ajuste
+ Ajuste da camisa
</string>
<string name="Shirt Wrinkles">
- Deslocar dobras
+ +/- amassada
</string>
<string name="Shoe Height">
Altura do sapato
@@ -3126,7 +3222,16 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Ver mais informações sobre a localização atual
</string>
<string name="LocationCtrlComboBtnTooltip">
- Meu histórico de localizações
+ 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
@@ -3158,6 +3263,12 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<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>
@@ -3185,6 +3296,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="IM_moderator_label">
(Moderador)
</string>
+ <string name="answered_call">
+ Ligação atendida
+ </string>
<string name="started_call">
Iniciou uma ligação de voz
</string>
@@ -3266,4 +3380,135 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<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="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="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>
</strings>
diff --git a/indra/newview/skins/default/xui/pt/teleport_strings.xml b/indra/newview/skins/default/xui/pt/teleport_strings.xml
index 1a0461082b..11ea0f4195 100644
--- a/indra/newview/skins/default/xui/pt/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/pt/teleport_strings.xml
@@ -51,7 +51,7 @@ Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE].
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 @@ Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE].
<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 ef93586c6e..1c29feec5f 100644
--- a/indra/newview/tests/lllogininstance_test.cpp
+++ b/indra/newview/tests/lllogininstance_test.cpp
@@ -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..fd680b24f0
--- /dev/null
+++ b/indra/newview/tests/llsechandler_basic_test.cpp
@@ -0,0 +1,1051 @@
+/**
+ * @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>
+
+
+#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};
+
+// -------------------------------------------------------------------------------------------
+// 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()
+ {
+ 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();
+ 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>()
+
+ {
+ unsigned char MACAddress[MAC_ADDRESS_BYTES];
+ LLUUID::getNodeID(MACAddress);
+
+ 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);
+ LLXORCipher cipher2(MACAddress, MAC_ADDRESS_BYTES);
+ 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());
+ unsigned char MACAddress[MAC_ADDRESS_BYTES];
+ LLUUID::getNodeID(MACAddress);
+ LLXORCipher cipher(gMACAddress, MAC_ADDRESS_BYTES);
+ cipher.decrypt((U8*)&decoded_password[0], length);
+ LLXORCipher cipher2(MACAddress, MAC_ADDRESS_BYTES);
+ 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_chain->validate(0, test_store, validation_params);
+
+ // add the root certificate to the chain and revalidate
+ test_chain->add(new LLBasicCertificate(mX509RootCert));
+ test_chain->validate(0, test_store, 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_chain->validate(0, test_store, validation_params);
+
+ // basic failure cases
+ test_chain = new LLBasicCertificateChain(NULL);
+ //validate with only the child cert
+ test_chain->add(new LLBasicCertificate(mX509ChildCert));
+ ensure_throws("no CA, with only a child cert",
+ LLCertValidationTrustException,
+ (*test_chain)[0],
+ test_chain->validate,
+ VALIDATION_POLICY_TRUSTED,
+ test_store,
+ validation_params);
+
+
+ // validate without the trust flag.
+ test_chain->validate(0, test_store, 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_chain->validate,
+ VALIDATION_POLICY_TRUSTED,
+ test_store,
+ validation_params);
+ // validate without the trust flag
+ test_chain->validate(0, test_store, validation_params);
+
+ // Test time validity
+ LLSD child_info = (*test_chain)[0]->getLLSD();
+ validation_params = LLSD::emptyMap();
+ validation_params[CERT_VALIDATION_DATE] = LLDate(child_info[CERT_VALID_FROM].asDate().secondsSinceEpoch() + 1.0);
+ test_chain->validate(VALIDATION_POLICY_TIME, test_store, 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_chain->validate,
+ VALIDATION_POLICY_TIME,
+ test_store,
+ 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_chain->validate,
+ VALIDATION_POLICY_TIME,
+ test_store,
+ 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_chain->validate(VALIDATION_POLICY_SSL_KU, test_store, validation_params);
+
+ test_chain = new LLBasicCertificateChain(NULL);
+ test_chain->add(new LLBasicCertificate(mX509TestCert));
+
+ ensure_throws("Cert doesn't have ku",
+ LLCertKeyUsageValidationException,
+ (*test_chain)[0],
+ test_chain->validate,
+ VALIDATION_POLICY_SSL_KU,
+ test_store,
+ validation_params);
+
+ // test sha1RSA validation
+ test_chain = new LLBasicCertificateChain(NULL);
+ test_chain->add(new LLBasicCertificate(mSha1RSATestCert));
+ test_chain->add(new LLBasicCertificate(mSha1RSATestCA));
+
+ test_chain->validate(0, test_store, 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/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp
new file mode 100644
index 0000000000..d819b44564
--- /dev/null
+++ b/indra/newview/tests/llviewernetwork_test.cpp
@@ -0,0 +1,456 @@
+/**
+ * @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");
+ 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");
+
+ 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"));
+ grid = LLGridManager::getInstance()->getGridInfo("grid1");
+ 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>()
+ {
+ gCmdLineLoginURI = "https://my.login.uri/cgi-bin/login.cgi";
+
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ // with single login uri specified.
+ std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
+ ensure_equals("adding a command line grid increases known grid size",
+ known_grids.size(), 24);
+ ensure_equals("Command line grid is added to the list of grids",
+ known_grids["my.login.uri"], std::string("my.login.uri"));
+ LLSD grid = LLGridManager::getInstance()->getGridInfo("my.login.uri");
+ ensure_equals("Command line grid name is set",
+ grid[GRID_VALUE].asString(), std::string("my.login.uri"));
+ ensure_equals("Command line grid label is set",
+ grid[GRID_LABEL_VALUE].asString(), std::string("my.login.uri"));
+ ensure("Command line grid login uri is an array",
+ grid[GRID_LOGIN_URI_VALUE].isArray());
+ ensure_equals("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("Command line grid helper uri is set",
+ grid[GRID_HELPER_URI_VALUE].asString(),
+ std::string("https://my.login.uri/helpers/"));
+ ensure_equals("Command line grid login page is set",
+ grid[GRID_LOGIN_PAGE_VALUE].asString(),
+ std::string("http://my.login.uri/app/login/"));
+ ensure("Command line grid favorite is set",
+ !grid.has(GRID_IS_FAVORITE_VALUE));
+ ensure("Command line grid isn't a system grid",
+ !grid.has(GRID_IS_SYSTEM_GRID_VALUE));
+
+ // 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"));
+ grid = LLGridManager::getInstance()->getGridInfo("mycustomgridchoice");
+ 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://my.login.uri/cgi-bin/login.cgi"));
+
+ // add a helperuri
+ gCmdLineHelperURI = "myhelperuri";
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ grid = LLGridManager::getInstance()->getGridInfo("mycustomgridchoice");
+ ensure_equals("Validate command line helper uri",
+ grid[GRID_HELPER_URI_VALUE].asString(), std::string("myhelperuri"));
+
+ // add a login page
+ gLoginPage = "myloginpage";
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ grid = LLGridManager::getInstance()->getGridInfo("mycustomgridchoice");
+ ensure_equals("Validate command line helper uri",
+ grid[GRID_LOGIN_PAGE_VALUE].asString(), std::string("myloginpage"));
+ }
+
+ // validate grid selection
+ template<> template<>
+ void viewerNetworkTestObject::test<4>()
+ {
+ 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();
+ grid = LLGridManager::getInstance()->getGridInfo("myaddedgrid");
+ ensure("setting favorite", grid.has(GRID_IS_FAVORITE_VALUE));
+ }
+
+ // name based grid population
+ template<> template<>
+ void viewerNetworkTestObject::test<5>()
+ {
+ 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);
+ grid = LLGridManager::getInstance()->getGridInfo("myaddedgrid");
+
+ 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<6>()
+ {
+ // 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<7>()
+ {
+
+ 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/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 3f379fcf75..2a966f4adf 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -332,6 +332,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"):
@@ -343,6 +349,7 @@ class WindowsManifest(ViewerManifest):
self.path("qtwebkitd4.dll")
self.path("qtxmlpatternsd4.dll")
self.path("ssleay32.dll")
+ self.path("winmm.dll")
# For WebKit/Qt plugin runtimes (image format plugins)
if self.prefix(src="imageformats", dst="imageformats"):
@@ -479,8 +486,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}"
"""
@@ -639,10 +646,14 @@ 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",
@@ -656,9 +667,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 +698,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()
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 e5a846f15a..7a544debb2 100644
--- a/indra/test_apps/llplugintest/llmediaplugintest.cpp
+++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp
@@ -241,6 +241,9 @@ LLMediaPluginTest::~LLMediaPluginTest()
{
remMediaPanel( mMediaPanels[ i ] );
};
+
+ // Stop the plugin read thread if it's running.
+ LLPluginProcessParent::setUseReadThread(false);
}
////////////////////////////////////////////////////////////////////////////////
@@ -1047,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
@@ -1431,6 +1439,12 @@ void LLMediaPluginTest::makeChrome()
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 );
@@ -1593,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
@@ -1831,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
@@ -1954,7 +1969,7 @@ void LLMediaPluginTest::updateStatusBar()
cached_distance == mDistanceCameraToSelectedGeometry
)
{
- // nothing changed so don't spend time in this shitty function
+ // nothing changed so don't spend time here
return;
};
diff --git a/indra/test_apps/llplugintest/llmediaplugintest.h b/indra/test_apps/llplugintest/llmediaplugintest.h
index e7c7699343..5d08e42148 100644
--- a/indra/test_apps/llplugintest/llmediaplugintest.h
+++ b/indra/test_apps/llplugintest/llmediaplugintest.h
@@ -164,6 +164,8 @@ class LLMediaPluginTest : public LLPluginClassMediaOwner
int mRandomBookmarks;
int mIdDisableTimeout;
int mDisableTimeout;
+ int mIdUsePluginReadThread;
+ int mUsePluginReadThread;
int mIdLargePanelSpacing;
int mLargePanelSpacing;
int mIdControlCrashPlugin;
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_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 3cd40d8893..1265963fb1 100644
--- a/install.xml
+++ b/install.xml
@@ -118,9 +118,9 @@
<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>
@@ -240,9 +240,9 @@
<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>78ccac8aaf8ea5bec482dfbcdbeb1651</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.19.6-windows-20100414.tar.bz2</uri>
</map>
</map>
</map>
@@ -298,25 +298,6 @@
</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>elfio</key>
<map>
<key>license</key>
@@ -967,23 +948,23 @@ anguage Infrstructure (CLI) international standard</string>
<key>darwin</key>
<map>
<key>md5sum</key>
- <string>95f44f0023dddc80be4398fc4f213861</string>
+ <string>1417e04ca4bec1ed281c43d37b613845</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.6-darwin-20100208.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.6+cookies-darwin-20100519.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
- <string>4b1913c509ea8bec78523960700d7005</string>
+ <string>7a5e02d252b76ab41bdca58506fa4147</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20100304.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20100521.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
- <string>1e9798dc424a6f6c2bea50649bbcc7ae</string>
+ <string>1d9697fed57084eea7b3dc250e9c66f7</string>
<key>url</key>
- <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.6-20100210.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-windows-qt4.6-20100525.tar.bz2</uri>
</map>
</map>
</map>
@@ -1131,9 +1112,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>
@@ -1285,6 +1266,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>
@@ -1386,23 +1386,23 @@ anguage Infrstructure (CLI) international standard</string>
<key>darwin</key>
<map>
<key>md5sum</key>
- <string>bce6f58d3d63bda049bb7059583ed8e8</string>
+ <string>4d29351a842fafe617de65a8183da160</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.8016-darwin-20100225.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.8744-darwin-20100519.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
- <string>12aac7288af3565ac2730796cb6d8de6</string>
+ <string>7541138c439b1c0312610d18968f27d2</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.8016-linux-20100225.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.8744-linux-20100519.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
- <string>8af04ae8c536e8db80f67e6e5305fb61</string>
+ <string>5d2b049ca5239da2dcebde91f7f25a43</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.8016-windows-20100225.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.8744-windows-20100519.tar.bz2</uri>
</map>
</map>
</map>