summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdoc/contributions.txt17
-rw-r--r--indra/integration_tests/llimage_libtest/llimage_libtest.cpp3
-rw-r--r--indra/llappearance/llavatarappearancedefines.h3
-rw-r--r--indra/llappearance/lltexlayer.h4
-rw-r--r--indra/llappearance/llwearabletype.cpp3
-rw-r--r--indra/llcommon/CMakeLists.txt11
-rw-r--r--indra/llcommon/llapp.cpp3
-rw-r--r--indra/llcommon/llassettype.cpp3
-rw-r--r--indra/llcommon/llcleanup.cpp29
-rw-r--r--indra/llcommon/llcleanup.h33
-rw-r--r--indra/llcommon/llcommon.cpp5
-rw-r--r--indra/llcommon/llcoro_get_id.cpp32
-rw-r--r--indra/llcommon/llcoro_get_id.h30
-rw-r--r--indra/llcommon/llcoros.cpp114
-rw-r--r--indra/llcommon/llcoros.h26
-rw-r--r--indra/llcommon/llerror.cpp53
-rw-r--r--indra/llcommon/llerror.h1
-rw-r--r--indra/llcommon/llerrorcontrol.h5
-rw-r--r--indra/llcommon/llevents.h3
-rw-r--r--indra/llcommon/llfile.cpp4
-rw-r--r--indra/llcommon/llfile.h2
-rw-r--r--indra/llcommon/llheteromap.cpp32
-rw-r--r--indra/llcommon/llheteromap.h95
-rw-r--r--indra/llcommon/llinitdestroyclass.cpp30
-rw-r--r--indra/llcommon/llinitdestroyclass.h175
-rw-r--r--indra/llcommon/llinitparam.cpp7
-rw-r--r--indra/llcommon/llinitparam.h1
-rw-r--r--indra/llcommon/llmetricperformancetester.cpp2
-rw-r--r--indra/llcommon/llmetricperformancetester.h2
-rw-r--r--indra/llcommon/llpounceable.h216
-rw-r--r--indra/llcommon/llregistry.h7
-rw-r--r--indra/llcommon/llsdparam.h1
-rw-r--r--indra/llcommon/llsdserialize.cpp1
-rw-r--r--indra/llcommon/llsingleton.cpp440
-rw-r--r--indra/llcommon/llsingleton.h637
-rw-r--r--indra/llcommon/tests/llheteromap_test.cpp163
-rw-r--r--indra/llcommon/tests/llpounceable_test.cpp230
-rw-r--r--indra/llcommon/tests/llsingleton_test.cpp207
-rw-r--r--indra/llcorehttp/CMakeLists.txt5
-rw-r--r--indra/llcorehttp/_httpoprequest.cpp12
-rwxr-xr-x[-rw-r--r--]indra/llcorehttp/tests/llcorehttp_test.cpp3
-rw-r--r--indra/llcorehttp/tests/test_httprequest.hpp67
-rwxr-xr-xindra/llcorehttp/tests/test_llcorehttp_peer.py35
-rwxr-xr-xindra/llcorehttp/tests/testrunner.py265
-rw-r--r--indra/llcrashlogger/llcrashlogger.cpp3
-rw-r--r--indra/llimage/llimage.cpp39
-rw-r--r--indra/llimage/llimage.h2
-rw-r--r--indra/llinventory/lleconomy.cpp25
-rw-r--r--indra/llinventory/lleconomy.h21
-rw-r--r--indra/llinventory/llfoldertype.cpp3
-rw-r--r--indra/llinventory/llinventorytype.cpp3
-rw-r--r--indra/llmath/llmath.h5
-rw-r--r--indra/llmath/llvolume.cpp135
-rw-r--r--indra/llmessage/llavatarname.cpp8
-rw-r--r--indra/llmessage/llavatarname.h4
-rw-r--r--indra/llmessage/llcoproceduremanager.h6
-rw-r--r--indra/llmessage/llexperiencecache.h3
-rw-r--r--indra/llmessage/llproxy.h8
-rw-r--r--indra/llmessage/llxfer_file.cpp6
-rw-r--r--indra/llmessage/llxfermanager.cpp2
-rw-r--r--indra/llmessage/message.cpp7
-rw-r--r--indra/llmessage/message.h7
-rw-r--r--indra/llmessage/tests/llhttpclient_test.cpp3
-rw-r--r--indra/llmessage/tests/lltemplatemessagedispatcher_test.cpp3
-rw-r--r--indra/llmessage/tests/lltrustedmessageservice_test.cpp3
-rw-r--r--indra/llmessage/tests/networkio.h3
-rwxr-xr-xindra/llmessage/tests/test_llsdmessage_peer.py27
-rwxr-xr-xindra/llmessage/tests/testrunner.py87
-rw-r--r--indra/llprimitive/lldaeloader.cpp2
-rw-r--r--indra/llrender/llimagegl.cpp6
-rw-r--r--indra/llrender/llrender.cpp11
-rw-r--r--indra/llrender/llvertexbuffer.cpp4
-rw-r--r--indra/llui/llaccordionctrltab.cpp3
-rw-r--r--indra/llui/llaccordionctrltab.h3
-rw-r--r--indra/llui/llclipboard.h4
-rw-r--r--indra/llui/llcommandmanager.h6
-rw-r--r--indra/llui/llcontainerview.h4
-rw-r--r--indra/llui/llflatlistview.cpp114
-rw-r--r--indra/llui/llflatlistview.h11
-rw-r--r--indra/llui/llfloater.cpp10
-rw-r--r--indra/llui/llfunctorregistry.h16
-rw-r--r--indra/llui/lllayoutstack.h4
-rw-r--r--indra/llui/lllineeditor.cpp10
-rw-r--r--indra/llui/lllineeditor.h3
-rw-r--r--indra/llui/llmenugl.cpp28
-rw-r--r--indra/llui/llmenugl.h9
-rw-r--r--indra/llui/llnotifications.h4
-rw-r--r--indra/llui/llpanel.h3
-rw-r--r--indra/llui/llradiogroup.cpp53
-rw-r--r--indra/llui/llradiogroup.h4
-rw-r--r--indra/llui/llresmgr.h4
-rw-r--r--indra/llui/llscrollcontainer.h4
-rw-r--r--indra/llui/llscrolllistctrl.cpp4
-rw-r--r--indra/llui/llspellcheck.cpp1
-rw-r--r--indra/llui/llspellcheck.h5
-rw-r--r--indra/llui/llspinctrl.cpp2
-rw-r--r--indra/llui/llstatbar.cpp7
-rw-r--r--indra/llui/llstatview.h4
-rw-r--r--indra/llui/lltabcontainer.cpp16
-rw-r--r--indra/llui/lltabcontainer.h2
-rw-r--r--indra/llui/lltextbase.cpp46
-rw-r--r--indra/llui/lltextbase.h22
-rw-r--r--indra/llui/lltextparser.h4
-rw-r--r--indra/llui/lltooltip.h3
-rw-r--r--indra/llui/llui.cpp3
-rw-r--r--indra/llui/llui.h89
-rw-r--r--indra/llui/lluicolortable.h3
-rw-r--r--indra/llui/lluictrl.h13
-rw-r--r--indra/llui/lluictrlfactory.cpp26
-rw-r--r--indra/llui/lluictrlfactory.h76
-rw-r--r--indra/llui/llurlentry.cpp6
-rw-r--r--indra/llui/llurlregistry.h7
-rw-r--r--indra/llui/llview.cpp2
-rw-r--r--indra/llui/llviewereventrecorder.h7
-rw-r--r--indra/llui/llviewquery.h6
-rw-r--r--indra/llui/llxuiparser.h12
-rwxr-xr-x[-rw-r--r--]indra/llui/tests/llurlentry_stub.cpp3
-rw-r--r--indra/llvfs/llvfs.cpp11
-rw-r--r--indra/llvfs/llvfs.h1
-rw-r--r--indra/llwindow/llwindowcallbacks.cpp4
-rw-r--r--indra/llwindow/llwindowcallbacks.h2
-rw-r--r--indra/llwindow/llwindowwin32.cpp26
-rw-r--r--indra/media_plugins/cef/windows_volume_catcher.cpp9
-rw-r--r--indra/media_plugins/libvlc/media_plugin_libvlc.cpp17
-rw-r--r--indra/newview/CMakeLists.txt8
-rw-r--r--indra/newview/app_settings/commands.xml10
-rw-r--r--indra/newview/app_settings/settings.xml48
-rw-r--r--indra/newview/app_settings/settings_per_account.xml63
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl4
-rw-r--r--indra/newview/llaccountingcostmanager.h4
-rw-r--r--indra/newview/llagent.cpp24
-rw-r--r--indra/newview/llagent.h8
-rw-r--r--indra/newview/llagentpicksinfo.h8
-rw-r--r--indra/newview/llagentwearables.h1
-rw-r--r--indra/newview/llappdelegate-objc.mm2
-rw-r--r--indra/newview/llappearancemgr.cpp70
-rw-r--r--indra/newview/llappearancemgr.h10
-rw-r--r--indra/newview/llappviewer.cpp131
-rw-r--r--indra/newview/llappviewer.h2
-rw-r--r--indra/newview/llattachmentsmgr.h6
-rw-r--r--indra/newview/llautoreplace.h3
-rw-r--r--indra/newview/llavataractions.cpp2
-rw-r--r--indra/newview/llavatariconctrl.h11
-rw-r--r--indra/newview/llavatarpropertiesprocessor.h7
-rw-r--r--indra/newview/llavatarrenderinfoaccountant.h6
-rw-r--r--indra/newview/llavatarrendernotifier.h8
-rw-r--r--indra/newview/llchannelmanager.h6
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp26
-rw-r--r--indra/newview/llchicletbar.cpp2
-rw-r--r--indra/newview/llchicletbar.h5
-rw-r--r--indra/newview/llconversationlog.h3
-rw-r--r--indra/newview/llconversationview.cpp7
-rw-r--r--indra/newview/lldaycyclemanager.h2
-rw-r--r--indra/newview/lldeferredsounds.h2
-rw-r--r--indra/newview/lldonotdisturbnotificationstorage.cpp3
-rw-r--r--indra/newview/lldonotdisturbnotificationstorage.h6
-rw-r--r--indra/newview/lldrawpoolalpha.cpp4
-rw-r--r--indra/newview/llenvmanager.cpp11
-rw-r--r--indra/newview/llenvmanager.h4
-rw-r--r--indra/newview/llestateinfomodel.h4
-rw-r--r--indra/newview/llexpandabletextbox.cpp4
-rw-r--r--indra/newview/llexperiencelog.h3
-rw-r--r--indra/newview/llfacebookconnect.h5
-rw-r--r--indra/newview/llfasttimerview.cpp4
-rw-r--r--indra/newview/llfavoritesbar.h12
-rw-r--r--indra/newview/llfeaturemanager.h26
-rw-r--r--indra/newview/llfilteredwearablelist.cpp5
-rw-r--r--indra/newview/llfilteredwearablelist.h5
-rw-r--r--indra/newview/llflickrconnect.h5
-rw-r--r--indra/newview/llfloateravatarpicker.cpp56
-rw-r--r--indra/newview/llfloaterbuycontents.cpp1
-rw-r--r--indra/newview/llfloaterbvhpreview.cpp2
-rw-r--r--indra/newview/llfloaterimcontainer.cpp12
-rw-r--r--indra/newview/llfloaterimnearbychathandler.cpp10
-rw-r--r--indra/newview/llfloaterinventory.cpp109
-rw-r--r--indra/newview/llfloaterinventory.h72
-rw-r--r--indra/newview/llfloaterland.cpp7
-rw-r--r--indra/newview/llfloatermodelpreview.cpp38
-rw-r--r--indra/newview/llfloatermodelpreview.h3
-rw-r--r--indra/newview/llfloatermodeluploadbase.cpp1
-rw-r--r--indra/newview/llfloaternamedesc.cpp4
-rw-r--r--indra/newview/llfloaterobjectweights.cpp8
-rw-r--r--indra/newview/llfloateropenobject.cpp1
-rw-r--r--indra/newview/llfloateroutfitphotopreview.cpp289
-rw-r--r--indra/newview/llfloateroutfitphotopreview.h77
-rw-r--r--indra/newview/llfloaterpathfindingobjects.cpp13
-rw-r--r--indra/newview/llfloaterpathfindingobjects.h2
-rw-r--r--indra/newview/llfloaterpay.cpp5
-rw-r--r--indra/newview/llfloaterperms.cpp5
-rw-r--r--indra/newview/llfloaterpreference.cpp64
-rw-r--r--indra/newview/llfloaterpreference.h4
-rw-r--r--indra/newview/llfloaterreporter.cpp133
-rw-r--r--indra/newview/llfloaterreporter.h11
-rw-r--r--indra/newview/llfloaterscriptdebug.cpp10
-rw-r--r--indra/newview/llfloaterscriptlimits.cpp43
-rw-r--r--indra/newview/llfloatersidepanelcontainer.cpp5
-rw-r--r--indra/newview/llfloatersidepanelcontainer.h2
-rw-r--r--indra/newview/llfloatersnapshot.cpp3
-rw-r--r--indra/newview/llfloatertools.cpp7
-rw-r--r--indra/newview/llfloaterworldmap.cpp4
-rw-r--r--indra/newview/llfriendcard.h5
-rw-r--r--indra/newview/llgesturemgr.h4
-rw-r--r--indra/newview/llgroupmgr.h4
-rw-r--r--indra/newview/llhints.h1
-rw-r--r--indra/newview/llhudmanager.h4
-rw-r--r--indra/newview/llimagefiltersmanager.h5
-rw-r--r--indra/newview/llimview.cpp22
-rw-r--r--indra/newview/llimview.h6
-rw-r--r--indra/newview/llinventorybridge.cpp78
-rw-r--r--indra/newview/llinventorybridge.h1
-rw-r--r--indra/newview/llinventoryfilter.cpp11
-rw-r--r--indra/newview/llinventoryfunctions.cpp32
-rw-r--r--indra/newview/llinventoryicon.cpp3
-rw-r--r--indra/newview/llinventoryitemslist.cpp207
-rw-r--r--indra/newview/llinventoryitemslist.h28
-rw-r--r--indra/newview/llinventorymodel.cpp36
-rw-r--r--indra/newview/llinventorymodel.h3
-rw-r--r--indra/newview/llinventorymodelbackgroundfetch.h4
-rw-r--r--indra/newview/llinventoryobserver.cpp25
-rw-r--r--indra/newview/llinventoryobserver.h4
-rw-r--r--indra/newview/llinventorypanel.cpp24
-rw-r--r--indra/newview/llinventorypanel.h1
-rw-r--r--indra/newview/lllocationhistory.h2
-rw-r--r--indra/newview/lllogchat.cpp19
-rw-r--r--indra/newview/llloginhandler.cpp1
-rw-r--r--indra/newview/lllogininstance.h6
-rw-r--r--indra/newview/llmainlooprepeater.h3
-rw-r--r--indra/newview/llmaniprotate.cpp5
-rw-r--r--indra/newview/llmanipscale.cpp5
-rw-r--r--indra/newview/llmaniptranslate.cpp3
-rw-r--r--indra/newview/llmarketplacefunctions.h13
-rw-r--r--indra/newview/llmaterialmgr.h4
-rw-r--r--indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp3
-rw-r--r--indra/newview/llmenuoptionpathfindingrebakenavmesh.h4
-rw-r--r--indra/newview/llmeshrepository.cpp12
-rw-r--r--indra/newview/llmutelist.cpp40
-rw-r--r--indra/newview/llmutelist.h9
-rwxr-xr-x[-rw-r--r--]indra/newview/llnavigationbar.h7
-rw-r--r--indra/newview/llnotificationmanager.h6
-rw-r--r--indra/newview/llnotificationstorage.cpp7
-rw-r--r--indra/newview/lloutfitgallery.cpp47
-rw-r--r--indra/newview/lloutfitgallery.h3
-rw-r--r--indra/newview/lloutfitobserver.h5
-rw-r--r--indra/newview/lloutfitslist.cpp11
-rw-r--r--indra/newview/llpaneleditwearable.cpp3
-rw-r--r--indra/newview/llpanelgroupnotices.cpp1
-rw-r--r--indra/newview/llpanelmaininventory.cpp30
-rw-r--r--indra/newview/llpanelmaininventory.h3
-rw-r--r--indra/newview/llpaneloutfitedit.cpp5
-rw-r--r--indra/newview/llpaneloutfitsinventory.cpp9
-rw-r--r--indra/newview/llpanelpermissions.cpp51
-rw-r--r--indra/newview/llpanelpermissions.h3
-rw-r--r--indra/newview/llpanelplaceprofile.cpp12
-rw-r--r--indra/newview/llpanelplaces.cpp51
-rw-r--r--indra/newview/llpanelprimmediacontrols.cpp11
-rw-r--r--indra/newview/llpanelsnapshotinventory.cpp6
-rw-r--r--indra/newview/llpanelsnapshotoptions.cpp6
-rw-r--r--indra/newview/llpanelteleporthistory.cpp4
-rw-r--r--indra/newview/llpaneltopinfobar.h6
-rw-r--r--indra/newview/llpanelwearing.cpp1
-rw-r--r--indra/newview/llpathfindingmanager.cpp3
-rw-r--r--indra/newview/llpathfindingmanager.h6
-rw-r--r--indra/newview/llpathfindingpathtool.cpp1
-rw-r--r--indra/newview/llpathfindingpathtool.h6
-rw-r--r--indra/newview/llpersistentnotificationstorage.cpp5
-rw-r--r--indra/newview/llpersistentnotificationstorage.h4
-rw-r--r--indra/newview/llplacesinventorybridge.cpp1
-rw-r--r--indra/newview/llplacesinventorypanel.h1
-rw-r--r--indra/newview/llpresetsmanager.cpp4
-rw-r--r--indra/newview/llpresetsmanager.h6
-rw-r--r--indra/newview/llproductinforequest.h3
-rw-r--r--indra/newview/llrecentpeople.h1
-rw-r--r--indra/newview/llregioninfomodel.h3
-rw-r--r--indra/newview/llremoteparcelrequest.h3
-rw-r--r--indra/newview/llrootview.h4
-rw-r--r--indra/newview/llscenemonitor.h4
-rw-r--r--indra/newview/llscreenchannel.cpp8
-rw-r--r--indra/newview/llscriptfloater.h1
-rw-r--r--indra/newview/llsearchhistory.h3
-rw-r--r--indra/newview/llselectmgr.cpp14
-rw-r--r--indra/newview/llselectmgr.h7
-rw-r--r--indra/newview/llsidepanelappearance.cpp23
-rw-r--r--indra/newview/llsidepanelinventory.cpp14
-rw-r--r--indra/newview/llsidepanelinventory.h2
-rw-r--r--indra/newview/llsnapshotlivepreview.cpp8
-rw-r--r--indra/newview/llspeakers.h8
-rw-r--r--indra/newview/llspeakingindicatormanager.cpp6
-rw-r--r--indra/newview/llstartup.cpp30
-rw-r--r--indra/newview/llstatusbar.cpp6
-rw-r--r--indra/newview/llstylemap.h1
-rw-r--r--indra/newview/llsyntaxid.cpp4
-rw-r--r--indra/newview/llsyntaxid.h6
-rw-r--r--indra/newview/llsyswellwindow.h1
-rw-r--r--indra/newview/llteleporthistory.h5
-rw-r--r--indra/newview/llteleporthistorystorage.h5
-rw-r--r--indra/newview/lltextureatlasmanager.h5
-rw-r--r--indra/newview/lltexturecache.cpp167
-rw-r--r--indra/newview/lltexturectrl.cpp13
-rw-r--r--indra/newview/lltexturectrl.h2
-rw-r--r--indra/newview/lltoastgroupnotifypanel.cpp1
-rw-r--r--indra/newview/lltool.cpp21
-rw-r--r--indra/newview/lltoolbrush.h2
-rw-r--r--indra/newview/lltoolcomp.cpp28
-rw-r--r--indra/newview/lltoolcomp.h28
-rw-r--r--indra/newview/lltooldraganddrop.h5
-rw-r--r--indra/newview/lltoolface.h4
-rw-r--r--indra/newview/lltoolfocus.h4
-rw-r--r--indra/newview/lltoolgrab.cpp54
-rw-r--r--indra/newview/lltoolgrab.h21
-rw-r--r--indra/newview/lltoolindividual.h4
-rw-r--r--indra/newview/lltoolmgr.h4
-rw-r--r--indra/newview/lltoolobjpicker.h2
-rw-r--r--indra/newview/lltoolpie.cpp65
-rw-r--r--indra/newview/lltoolpie.h2
-rw-r--r--indra/newview/lltoolpipette.h4
-rw-r--r--indra/newview/lltoolselectland.h4
-rw-r--r--indra/newview/lltransientfloatermgr.h4
-rw-r--r--indra/newview/lltwitterconnect.h4
-rw-r--r--indra/newview/llviewerassettype.cpp3
-rw-r--r--indra/newview/llviewerassetupload.cpp16
-rw-r--r--indra/newview/llvieweraudio.h6
-rw-r--r--indra/newview/llviewercamera.h3
-rw-r--r--indra/newview/llviewercontrol.cpp2
-rw-r--r--indra/newview/llviewerfloaterreg.cpp3
-rw-r--r--indra/newview/llviewerfoldertype.cpp3
-rw-r--r--indra/newview/llviewerhelp.h2
-rw-r--r--indra/newview/llviewerinventory.cpp207
-rw-r--r--indra/newview/llviewerinventory.h2
-rw-r--r--indra/newview/llviewerjoystick.h6
-rw-r--r--indra/newview/llviewerkeyboard.cpp1
-rw-r--r--indra/newview/llviewermedia.cpp92
-rw-r--r--indra/newview/llviewermedia.h6
-rw-r--r--indra/newview/llviewermediafocus.h6
-rw-r--r--indra/newview/llviewermenu.cpp148
-rw-r--r--indra/newview/llviewermenufile.cpp12
-rw-r--r--indra/newview/llviewermessage.cpp40
-rw-r--r--indra/newview/llviewermessage.h1
-rw-r--r--indra/newview/llviewernetwork.cpp7
-rw-r--r--indra/newview/llviewernetwork.h9
-rw-r--r--indra/newview/llviewerobject.cpp11
-rw-r--r--indra/newview/llviewerparcelmgr.cpp2
-rw-r--r--indra/newview/llviewerparcelmgr.h5
-rw-r--r--indra/newview/llviewerpartsim.h3
-rw-r--r--indra/newview/llviewerstats.h8
-rw-r--r--indra/newview/llviewerstatsrecorder.h6
-rw-r--r--indra/newview/llviewertexteditor.cpp12
-rw-r--r--indra/newview/llviewertexteditor.h1
-rw-r--r--indra/newview/llviewertexture.cpp8
-rw-r--r--indra/newview/llviewertexturelist.h1
-rw-r--r--indra/newview/llviewerwindow.cpp29
-rw-r--r--indra/newview/llviewerwindow.h2
-rw-r--r--indra/newview/llvocache.h8
-rw-r--r--indra/newview/llvoicechannel.h2
-rw-r--r--indra/newview/llvoiceclient.h10
-rw-r--r--indra/newview/llvoicevivox.h13
-rw-r--r--indra/newview/llvovolume.cpp4
-rw-r--r--indra/newview/llvowlsky.cpp12
-rw-r--r--indra/newview/llwatchdog.h4
-rw-r--r--indra/newview/llwaterparammanager.h6
-rw-r--r--indra/newview/llwearableitemslist.cpp24
-rw-r--r--indra/newview/llwearableitemslist.h4
-rw-r--r--indra/newview/llwearablelist.h4
-rw-r--r--indra/newview/llwindebug.h1
-rw-r--r--indra/newview/llwlanimator.cpp21
-rw-r--r--indra/newview/llwlparammanager.h6
-rw-r--r--indra/newview/llworld.h2
-rw-r--r--indra/newview/llworldmap.h4
-rw-r--r--indra/newview/llworldmapmessage.h6
-rw-r--r--indra/newview/pipeline.cpp5
-rw-r--r--indra/newview/skins/default/textures/textures.xml1
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/report_abuse.pngbin0 -> 407 bytes
-rw-r--r--indra/newview/skins/default/xui/da/floater_about.xml1
-rw-r--r--indra/newview/skins/default/xui/de/floater_model_preview.xml1
-rw-r--r--indra/newview/skins/default/xui/de/floater_pay.xml23
-rw-r--r--indra/newview/skins/default/xui/de/floater_script_queue.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_web_content.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_attachment_other.xml1
-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.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_avatar_self.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_login.xml3
-rw-r--r--indra/newview/skins/default/xui/de/menu_object_icon.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_friends_view.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_nearby.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_nearby_view.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_url_objectim.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_viewer.xml13
-rw-r--r--indra/newview/skins/default/xui/de/menu_wearing_tab.xml2
-rw-r--r--indra/newview/skins/default/xui/de/mime_types.xml10
-rw-r--r--indra/newview/skins/default/xui/de/notifications.xml126
-rw-r--r--indra/newview/skins/default/xui/de/panel_outfits_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/de/panel_outfits_wearing.xml9
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_setup.xml1
-rw-r--r--indra/newview/skins/default/xui/de/strings.xml83
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_camera.xml5
-rw-r--r--indra/newview/skins/default/xui/en/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_edit_hover_height.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_facebook.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_flickr.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_inspect.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_moveview.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_outfit_photo_preview.xml65
-rw-r--r--indra/newview/skins/default/xui/en/floater_outgoing_call.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_pay.xml24
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences.xml7
-rw-r--r--indra/newview/skins/default/xui/en/floater_scene_load_stats.xml16
-rw-r--r--indra/newview/skins/default/xui/en/floater_script_limits.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_stats.xml9
-rw-r--r--indra/newview/skins/default/xui/en/floater_texture_ctrl.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_twitter.xml3
-rw-r--r--indra/newview/skins/default/xui/en/menu_gesture_gear.xml3
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory.xml45
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml6
-rw-r--r--indra/newview/skins/default/xui/en/menu_login.xml24
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml29
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml29
-rw-r--r--indra/newview/skins/default/xui/en/panel_login.xml5
-rw-r--r--indra/newview/skins/default/xui/en/panel_notification.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfit_gallery.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_inventory.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_advanced.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_setup.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_sound.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_uploads.xml135
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_general.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_script_limits_my_avatar.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml34
-rw-r--r--indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml3
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml27
-rw-r--r--indra/newview/skins/default/xui/en/widgets/location_input.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/slider.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/texture_picker.xml3
-rw-r--r--indra/newview/skins/default/xui/es/floater_model_preview.xml1
-rw-r--r--indra/newview/skins/default/xui/es/floater_pay.xml23
-rw-r--r--indra/newview/skins/default/xui/es/floater_script_queue.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_web_content.xml4
-rw-r--r--indra/newview/skins/default/xui/es/menu_attachment_other.xml1
-rw-r--r--indra/newview/skins/default/xui/es/menu_attachment_self.xml1
-rw-r--r--indra/newview/skins/default/xui/es/menu_avatar_other.xml1
-rw-r--r--indra/newview/skins/default/xui/es/menu_avatar_self.xml1
-rw-r--r--indra/newview/skins/default/xui/es/menu_login.xml3
-rw-r--r--indra/newview/skins/default/xui/es/menu_object_icon.xml1
-rw-r--r--indra/newview/skins/default/xui/es/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_friends_view.xml1
-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_view.xml1
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_objectim.xml1
-rw-r--r--indra/newview/skins/default/xui/es/menu_viewer.xml13
-rw-r--r--indra/newview/skins/default/xui/es/menu_wearing_tab.xml2
-rw-r--r--indra/newview/skins/default/xui/es/mime_types.xml31
-rw-r--r--indra/newview/skins/default/xui/es/notifications.xml129
-rw-r--r--indra/newview/skins/default/xui/es/panel_outfits_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/es/panel_outfits_wearing.xml9
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_setup.xml1
-rw-r--r--indra/newview/skins/default/xui/es/strings.xml83
-rw-r--r--indra/newview/skins/default/xui/fr/floater_model_preview.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/floater_pay.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preferences_graphics_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_script_queue.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_web_content.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/menu_attachment_other.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/menu_attachment_self.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/menu_avatar_other.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/menu_avatar_self.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/menu_login.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/menu_object_icon.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_friends_view.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_nearby.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_nearby_view.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/menu_url_objectim.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/menu_viewer.xml13
-rw-r--r--indra/newview/skins/default/xui/fr/menu_wearing_tab.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/mime_types.xml31
-rw-r--r--indra/newview/skins/default/xui/fr/notifications.xml131
-rw-r--r--indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/panel_outfits_wearing.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_setup.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml83
-rw-r--r--indra/newview/skins/default/xui/it/floater_model_preview.xml1
-rw-r--r--indra/newview/skins/default/xui/it/floater_pay.xml23
-rw-r--r--indra/newview/skins/default/xui/it/floater_script_queue.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_web_content.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_attachment_other.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_attachment_self.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_avatar_other.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_avatar_self.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_login.xml3
-rw-r--r--indra/newview/skins/default/xui/it/menu_object_icon.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_friends_view.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_nearby.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_nearby_view.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_objectim.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_viewer.xml13
-rw-r--r--indra/newview/skins/default/xui/it/menu_wearing_tab.xml2
-rw-r--r--indra/newview/skins/default/xui/it/mime_types.xml31
-rw-r--r--indra/newview/skins/default/xui/it/notifications.xml130
-rw-r--r--indra/newview/skins/default/xui/it/panel_outfits_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/it/panel_outfits_wearing.xml9
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_setup.xml1
-rw-r--r--indra/newview/skins/default/xui/it/strings.xml85
-rw-r--r--indra/newview/skins/default/xui/ja/floater_model_preview.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pay.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/floater_script_queue.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_web_content.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_attachment_other.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_attachment_self.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_other.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_self.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_login.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/menu_object_icon.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_friends_view.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_nearby.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_objectim.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_viewer.xml13
-rw-r--r--indra/newview/skins/default/xui/ja/menu_wearing_tab.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/mime_types.xml31
-rw-r--r--indra/newview/skins/default/xui/ja/notifications.xml131
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfits_wearing.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_setup.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/strings.xml87
-rw-r--r--indra/newview/skins/default/xui/pl/strings.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/floater_model_preview.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/floater_pay.xml23
-rw-r--r--indra/newview/skins/default/xui/pt/floater_script_queue.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_web_content.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/menu_attachment_other.xml1
-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.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/menu_avatar_self.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/menu_login.xml3
-rw-r--r--indra/newview/skins/default/xui/pt/menu_object_icon.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_friends_view.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_nearby.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_nearby_view.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_objectim.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/menu_viewer.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/menu_wearing_tab.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/mime_types.xml31
-rw-r--r--indra/newview/skins/default/xui/pt/notifications.xml127
-rw-r--r--indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/panel_outfits_wearing.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_setup.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/strings.xml83
-rw-r--r--indra/newview/skins/default/xui/ru/floater_model_preview.xml1
-rw-r--r--indra/newview/skins/default/xui/ru/floater_pay.xml23
-rw-r--r--indra/newview/skins/default/xui/ru/floater_script_queue.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/floater_web_content.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/menu_attachment_other.xml1
-rw-r--r--indra/newview/skins/default/xui/ru/menu_attachment_self.xml1
-rw-r--r--indra/newview/skins/default/xui/ru/menu_avatar_other.xml1
-rw-r--r--indra/newview/skins/default/xui/ru/menu_avatar_self.xml1
-rw-r--r--indra/newview/skins/default/xui/ru/menu_login.xml3
-rw-r--r--indra/newview/skins/default/xui/ru/menu_object_icon.xml1
-rw-r--r--indra/newview/skins/default/xui/ru/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_friends_view.xml1
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_nearby.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_nearby_view.xml1
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_objectim.xml1
-rw-r--r--indra/newview/skins/default/xui/ru/menu_viewer.xml13
-rw-r--r--indra/newview/skins/default/xui/ru/menu_wearing_tab.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/mime_types.xml10
-rw-r--r--indra/newview/skins/default/xui/ru/notifications.xml127
-rw-r--r--indra/newview/skins/default/xui/ru/panel_outfits_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/ru/panel_outfits_wearing.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_setup.xml1
-rw-r--r--indra/newview/skins/default/xui/ru/strings.xml83
-rw-r--r--indra/newview/skins/default/xui/tr/floater_model_preview.xml1
-rw-r--r--indra/newview/skins/default/xui/tr/floater_pay.xml23
-rw-r--r--indra/newview/skins/default/xui/tr/floater_preferences_graphics_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_script_queue.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/floater_web_content.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/menu_attachment_other.xml1
-rw-r--r--indra/newview/skins/default/xui/tr/menu_attachment_self.xml1
-rw-r--r--indra/newview/skins/default/xui/tr/menu_avatar_other.xml1
-rw-r--r--indra/newview/skins/default/xui/tr/menu_avatar_self.xml1
-rw-r--r--indra/newview/skins/default/xui/tr/menu_login.xml3
-rw-r--r--indra/newview/skins/default/xui/tr/menu_object_icon.xml1
-rw-r--r--indra/newview/skins/default/xui/tr/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_friends_view.xml1
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_nearby.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_nearby_view.xml1
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_objectim.xml1
-rw-r--r--indra/newview/skins/default/xui/tr/menu_viewer.xml13
-rw-r--r--indra/newview/skins/default/xui/tr/menu_wearing_tab.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/mime_types.xml10
-rw-r--r--indra/newview/skins/default/xui/tr/notifications.xml128
-rw-r--r--indra/newview/skins/default/xui/tr/panel_outfits_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/tr/panel_outfits_wearing.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_setup.xml1
-rw-r--r--indra/newview/skins/default/xui/tr/strings.xml85
-rw-r--r--indra/newview/skins/default/xui/zh/floater_model_preview.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/floater_pay.xml23
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preferences_graphics_advanced.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_queue.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/floater_web_content.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_attachment_other.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/menu_attachment_self.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/menu_avatar_other.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/menu_avatar_self.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/menu_login.xml3
-rw-r--r--indra/newview/skins/default/xui/zh/menu_object_icon.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_friends_view.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_nearby.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_nearby_view.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_objectim.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/menu_viewer.xml13
-rw-r--r--indra/newview/skins/default/xui/zh/menu_wearing_tab.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/mime_types.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/notifications.xml129
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfits_wearing.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_setup.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/strings.xml83
-rw-r--r--indra/newview/tests/llremoteparcelrequest_test.cpp3
-rwxr-xr-xindra/newview/tests/test_llxmlrpc_peer.py36
-rw-r--r--indra/test/message_tut.cpp2
-rw-r--r--scripts/content_tools/anim_tool.py18
634 files changed, 8535 insertions, 3052 deletions
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 521be7b7e2..0fb6110adb 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -204,6 +204,16 @@ Ansariel Hiller
MAINT-6636
MAINT-6744
MAINT-6752
+ MAINT-6773
+ MAINT-6906
+ MAINT-6911
+ STORM-2140
+ MAINT-6912
+ MAINT-6929
+ STORM-2141
+ MAINT-6953
+ MAINT-7028
+ MAINT-7059
Aralara Rajal
Arare Chantilly
CHUIBUG-191
@@ -751,6 +761,11 @@ Jonathan Yap
STORM-2088
STORM-2094
STORM-2099
+ STORM-2091
+ STORM-2092
+ STORM-2100
+ STORM-2104
+ STORM-2142
Kadah Coba
STORM-1060
STORM-1843
@@ -1248,6 +1263,7 @@ Shyotl Kuhr
MAINT-1138
MAINT-2334
MAINT-6913
+ STORM-2143
Siana Gearz
STORM-960
STORM-1088
@@ -1282,6 +1298,7 @@ Sovereign Engineer
STORM-2107
MAINT-6218
MAINT-6913
+ STORM-2143
SpacedOut Frye
VWR-34
VWR-45
diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
index 3d27b4a5b5..f4dba16a94 100644
--- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
+++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
@@ -42,6 +42,7 @@
#include "lldiriterator.h"
#include "v4coloru.h"
#include "llsdserialize.h"
+#include "llcleanup.h"
// system libraries
#include <iostream>
@@ -634,7 +635,7 @@ int main(int argc, char** argv)
}
// Cleanup and exit
- LLImage::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLImage);
if (fast_timer_log_thread)
{
fast_timer_log_thread->shutdown();
diff --git a/indra/llappearance/llavatarappearancedefines.h b/indra/llappearance/llavatarappearancedefines.h
index 8a1d2c4707..d6223bb4d2 100644
--- a/indra/llappearance/llavatarappearancedefines.h
+++ b/indra/llappearance/llavatarappearancedefines.h
@@ -127,8 +127,7 @@ class LLAvatarAppearanceDictionary : public LLSingleton<LLAvatarAppearanceDictio
//--------------------------------------------------------------------
// Constructors and Destructors
//--------------------------------------------------------------------
-public:
- LLAvatarAppearanceDictionary();
+ LLSINGLETON(LLAvatarAppearanceDictionary);
virtual ~LLAvatarAppearanceDictionary();
private:
void createAssociations();
diff --git a/indra/llappearance/lltexlayer.h b/indra/llappearance/lltexlayer.h
index 959d6e499a..9318b23fd1 100644
--- a/indra/llappearance/lltexlayer.h
+++ b/indra/llappearance/lltexlayer.h
@@ -293,9 +293,9 @@ protected:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLTexLayerStaticImageList : public LLSingleton<LLTexLayerStaticImageList>
{
-public:
- LLTexLayerStaticImageList();
+ LLSINGLETON(LLTexLayerStaticImageList);
~LLTexLayerStaticImageList();
+public:
LLGLTexture* getTexture(const std::string& file_name, BOOL is_mask);
LLImageTGA* getImageTGA(const std::string& file_name);
void deleteCachedImages();
diff --git a/indra/llappearance/llwearabletype.cpp b/indra/llappearance/llwearabletype.cpp
index 87109a5906..207e0c4011 100644
--- a/indra/llappearance/llwearabletype.cpp
+++ b/indra/llappearance/llwearabletype.cpp
@@ -71,8 +71,7 @@ struct WearableEntry : public LLDictionaryEntry
class LLWearableDictionary : public LLSingleton<LLWearableDictionary>,
public LLDictionary<LLWearableType::EType, WearableEntry>
{
-public:
- LLWearableDictionary();
+ LLSINGLETON(LLWearableDictionary);
};
LLWearableDictionary::LLWearableDictionary()
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 5bce2b8809..3493f80556 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -41,8 +41,10 @@ set(llcommon_SOURCE_FILES
llbitpack.cpp
llcallbacklist.cpp
llcallstack.cpp
+ llcleanup.cpp
llcommon.cpp
llcommonutils.cpp
+ llcoro_get_id.cpp
llcoros.cpp
llcrc.cpp
llcriticaldamp.cpp
@@ -67,7 +69,9 @@ set(llcommon_SOURCE_FILES
llformat.cpp
llframetimer.cpp
llheartbeat.cpp
+ llheteromap.cpp
llinitparam.cpp
+ llinitdestroyclass.cpp
llinstancetracker.cpp
llleap.cpp
llleaplistener.cpp
@@ -138,8 +142,10 @@ set(llcommon_HEADER_FILES
llboost.h
llcallbacklist.h
llcallstack.h
+ llcleanup.h
llcommon.h
llcommonutils.h
+ llcoro_get_id.h
llcoros.h
llcrc.h
llcriticaldamp.h
@@ -171,7 +177,9 @@ set(llcommon_HEADER_FILES
llhandle.h
llhash.h
llheartbeat.h
+ llheteromap.h
llindexedvector.h
+ llinitdestroyclass.h
llinitparam.h
llinstancetracker.h
llkeythrottle.h
@@ -188,6 +196,7 @@ set(llcommon_HEADER_FILES
llmortician.h
llnametable.h
llpointer.h
+ llpounceable.h
llpredicate.h
llpreprocessor.h
llpriqueuemap.h
@@ -333,6 +342,8 @@ if (LL_TESTS)
LL_ADD_INTEGRATION_TEST(llprocess "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llleap "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llstreamqueue "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llpounceable "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llheteromap "" "${test_libs}")
## llexception_test.cpp isn't a regression test, and doesn't need to be run
## every build. It's to help a developer make implementation choices about
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index eb0699ad41..2c76f29020 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -48,6 +48,7 @@
#include "lleventtimer.h"
#include "google_breakpad/exception_handler.h"
#include "stringize.h"
+#include "llcleanup.h"
//
// Signal handling
@@ -177,7 +178,7 @@ LLApp::~LLApp()
if(mExceptionHandler != 0) delete mExceptionHandler;
- LLCommon::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLCommon);
}
// static
diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp
index 5ae2df3994..4304db36be 100644
--- a/indra/llcommon/llassettype.cpp
+++ b/indra/llcommon/llassettype.cpp
@@ -63,8 +63,7 @@ struct AssetEntry : public LLDictionaryEntry
class LLAssetDictionary : public LLSingleton<LLAssetDictionary>,
public LLDictionary<LLAssetType::EType, AssetEntry>
{
-public:
- LLAssetDictionary();
+ LLSINGLETON(LLAssetDictionary);
};
LLAssetDictionary::LLAssetDictionary()
diff --git a/indra/llcommon/llcleanup.cpp b/indra/llcommon/llcleanup.cpp
new file mode 100644
index 0000000000..c5283507bf
--- /dev/null
+++ b/indra/llcommon/llcleanup.cpp
@@ -0,0 +1,29 @@
+/**
+ * @file llcleanup.cpp
+ * @author Nat Goodspeed
+ * @date 2016-08-30
+ * @brief Implementation for llcleanup.
+ *
+ * $LicenseInfo:firstyear=2016&license=viewerlgpl$
+ * Copyright (c) 2016, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llcleanup.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llerror.h"
+#include "llerrorcontrol.h"
+
+void log_subsystem_cleanup(const char* file, int line, const char* function,
+ const char* classname)
+{
+ LL_INFOS("Cleanup") << LLError::abbreviateFile(file) << "(" << line << "): "
+ << "calling " << classname << "::cleanupClass() in "
+ << function << LL_ENDL;
+}
diff --git a/indra/llcommon/llcleanup.h b/indra/llcommon/llcleanup.h
new file mode 100644
index 0000000000..a319171b5f
--- /dev/null
+++ b/indra/llcommon/llcleanup.h
@@ -0,0 +1,33 @@
+/**
+ * @file llcleanup.h
+ * @author Nat Goodspeed
+ * @date 2015-05-20
+ * @brief Mechanism for cleaning up subsystem resources
+ *
+ * $LicenseInfo:firstyear=2015&license=viewerlgpl$
+ * Copyright (c) 2015, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLCLEANUP_H)
+#define LL_LLCLEANUP_H
+
+#include <boost/current_function.hpp>
+
+// Instead of directly calling SomeClass::cleanupClass(), use
+// SUBSYSTEM_CLEANUP(SomeClass);
+// This logs the call as well as performing it. That gives us a baseline
+// subsystem shutdown order against which to compare subsequent dynamic
+// shutdown schemes.
+#define SUBSYSTEM_CLEANUP(CLASSNAME) \
+ do { \
+ log_subsystem_cleanup(__FILE__, __LINE__, BOOST_CURRENT_FUNCTION, #CLASSNAME); \
+ CLASSNAME::cleanupClass(); \
+ } while (0)
+// Use ancient do { ... } while (0) macro trick to permit a block of
+// statements with the same syntax as a single statement.
+
+void log_subsystem_cleanup(const char* file, int line, const char* function,
+ const char* classname);
+
+#endif /* ! defined(LL_LLCLEANUP_H) */
diff --git a/indra/llcommon/llcommon.cpp b/indra/llcommon/llcommon.cpp
index 19642b0982..439ff4e628 100644
--- a/indra/llcommon/llcommon.cpp
+++ b/indra/llcommon/llcommon.cpp
@@ -31,6 +31,7 @@
#include "llthread.h"
#include "lltrace.h"
#include "lltracethreadrecorder.h"
+#include "llcleanup.h"
//static
BOOL LLCommon::sAprInitialized = FALSE;
@@ -63,11 +64,11 @@ void LLCommon::cleanupClass()
sMasterThreadRecorder = NULL;
LLTrace::set_master_thread_recorder(NULL);
LLThreadSafeRefCount::cleanupThreadSafeRefCount();
- LLTimer::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLTimer);
if (sAprInitialized)
{
ll_cleanup_apr();
sAprInitialized = FALSE;
}
- LLMemory::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLMemory);
}
diff --git a/indra/llcommon/llcoro_get_id.cpp b/indra/llcommon/llcoro_get_id.cpp
new file mode 100644
index 0000000000..24ed1fe0c9
--- /dev/null
+++ b/indra/llcommon/llcoro_get_id.cpp
@@ -0,0 +1,32 @@
+/**
+ * @file llcoro_get_id.cpp
+ * @author Nat Goodspeed
+ * @date 2016-09-03
+ * @brief Implementation for llcoro_get_id.
+ *
+ * $LicenseInfo:firstyear=2016&license=viewerlgpl$
+ * Copyright (c) 2016, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llcoro_get_id.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llcoros.h"
+
+namespace llcoro
+{
+
+id get_id()
+{
+ // An instance of Current can convert to LLCoros::CoroData*, which can
+ // implicitly convert to void*, which is an llcoro::id.
+ return LLCoros::Current();
+}
+
+} // llcoro
diff --git a/indra/llcommon/llcoro_get_id.h b/indra/llcommon/llcoro_get_id.h
new file mode 100644
index 0000000000..4c1dca6f19
--- /dev/null
+++ b/indra/llcommon/llcoro_get_id.h
@@ -0,0 +1,30 @@
+/**
+ * @file llcoro_get_id.h
+ * @author Nat Goodspeed
+ * @date 2016-09-03
+ * @brief Supplement the functionality in llcoro.h.
+ *
+ * This is broken out as a separate header file to resolve
+ * circularity: LLCoros isa LLSingleton, yet LLSingleton machinery
+ * requires llcoro::get_id().
+ *
+ * Be very suspicious of anyone else #including this header.
+ *
+ * $LicenseInfo:firstyear=2016&license=viewerlgpl$
+ * Copyright (c) 2016, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLCORO_GET_ID_H)
+#define LL_LLCORO_GET_ID_H
+
+namespace llcoro
+{
+
+/// Get an opaque, distinct token for the running coroutine (or main).
+typedef void* id;
+id get_id();
+
+} // llcoro
+
+#endif /* ! defined(LL_LLCORO_GET_ID_H) */
diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp
index 8e516d8beb..3ffce4810a 100644
--- a/indra/llcommon/llcoros.cpp
+++ b/indra/llcommon/llcoros.cpp
@@ -40,32 +40,79 @@
#include "stringize.h"
#include "llexception.h"
-// do nothing, when we need nothing done
+namespace {
+void no_op() {}
+} // anonymous namespace
+
+// Do nothing, when we need nothing done. This is a static member of LLCoros
+// because CoroData is a private nested class.
void LLCoros::no_cleanup(CoroData*) {}
// CoroData for the currently-running coroutine. Use a thread_specific_ptr
// because each thread potentially has its own distinct pool of coroutines.
-// This thread_specific_ptr does NOT own the CoroData object! That's owned by
-// LLCoros::mCoros. It merely identifies it. For this reason we instantiate
-// it with a no-op cleanup function.
-boost::thread_specific_ptr<LLCoros::CoroData>
-LLCoros::sCurrentCoro(LLCoros::no_cleanup);
+LLCoros::Current::Current()
+{
+ // Use a function-static instance so this thread_specific_ptr is
+ // instantiated on demand. Since we happen to know it's consumed by
+ // LLSingleton, this is likely to happen before the runtime has finished
+ // initializing module-static data. For the same reason, we can't package
+ // this pointer in an LLSingleton.
+
+ // This thread_specific_ptr does NOT own the CoroData object! That's owned
+ // by LLCoros::mCoros. It merely identifies it. For this reason we
+ // instantiate it with a no-op cleanup function.
+ static boost::thread_specific_ptr<LLCoros::CoroData> sCurrent(LLCoros::no_cleanup);
+
+ // If this is the first time we're accessing sCurrent for the running
+ // thread, its get() will be NULL. This could be a problem, in that
+ // llcoro::get_id() would return the same (NULL) token value for the "main
+ // coroutine" in every thread, whereas what we really want is a distinct
+ // value for every distinct stack in the process. So if get() is NULL,
+ // give it a heap CoroData: this ensures that llcoro::get_id() will return
+ // distinct values.
+ // This tactic is "leaky": sCurrent explicitly does not destroy any
+ // CoroData to which it points, and we do NOT enter these "main coroutine"
+ // CoroData instances in the LLCoros::mCoros map. They are dummy entries,
+ // and they will leak at process shutdown: one CoroData per thread.
+ if (! sCurrent.get())
+ {
+ // It's tempting to provide a distinct name for each thread's "main
+ // coroutine." But as getName() has always returned the empty string
+ // to mean "not in a coroutine," empty string should suffice here --
+ // and truthfully the additional (thread-safe!) machinery to ensure
+ // uniqueness just doesn't feel worth the trouble.
+ // We use a no-op callable and a minimal stack size because, although
+ // CoroData's constructor in fact initializes its mCoro with a
+ // coroutine with that stack size, no one ever actually enters it by
+ // calling mCoro().
+ sCurrent.reset(new CoroData(0, // no prev
+ "", // not a named coroutine
+ no_op, // no-op callable
+ 1024)); // stacksize moot
+ }
+
+ mCurrent = &sCurrent;
+}
//static
LLCoros::CoroData& LLCoros::get_CoroData(const std::string& caller)
{
- CoroData* current = sCurrentCoro.get();
- if (! current)
- {
- LL_ERRS("LLCoros") << "Calling " << caller << " from non-coroutine context!" << LL_ENDL;
- }
+ CoroData* current = Current();
+ // With the dummy CoroData set in LLCoros::Current::Current(), this
+ // pointer should never be NULL.
+ llassert_always(current);
return *current;
}
//static
LLCoros::coro::self& LLCoros::get_self()
{
- return *get_CoroData("get_self()").mSelf;
+ CoroData& current = get_CoroData("get_self()");
+ if (! current.mSelf)
+ {
+ LL_ERRS("LLCoros") << "Calling get_self() from non-coroutine context!" << LL_ENDL;
+ }
+ return *current.mSelf;
}
//static
@@ -80,20 +127,23 @@ bool LLCoros::get_consuming()
return get_CoroData("get_consuming()").mConsuming;
}
-llcoro::Suspending::Suspending():
- mSuspended(LLCoros::sCurrentCoro.get())
+llcoro::Suspending::Suspending()
{
- // Revert mCurrentCoro to the value it had at the moment we last switched
+ LLCoros::Current current;
+ // Remember currently-running coroutine: we're about to suspend it.
+ mSuspended = current;
+ // Revert Current to the value it had at the moment we last switched
// into this coroutine.
- LLCoros::sCurrentCoro.reset(mSuspended->mPrev);
+ current.reset(mSuspended->mPrev);
}
llcoro::Suspending::~Suspending()
{
+ LLCoros::Current current;
// Okay, we're back, update our mPrev
- mSuspended->mPrev = LLCoros::sCurrentCoro.get();
- // and reinstate our sCurrentCoro.
- LLCoros::sCurrentCoro.reset(mSuspended);
+ mSuspended->mPrev = current;
+ // and reinstate our Current.
+ current.reset(mSuspended);
}
LLCoros::LLCoros():
@@ -213,13 +263,7 @@ bool LLCoros::kill(const std::string& name)
std::string LLCoros::getName() const
{
- CoroData* current = sCurrentCoro.get();
- if (! current)
- {
- // not in a coroutine
- return "";
- }
- return current->mName;
+ return Current()->mName;
}
void LLCoros::setStackSize(S32 stacksize)
@@ -229,8 +273,8 @@ void LLCoros::setStackSize(S32 stacksize)
}
// Top-level wrapper around caller's coroutine callable. This function accepts
-// the coroutine library's implicit coro::self& parameter and sets sCurrentSelf
-// but does not pass it down to the caller's callable.
+// the coroutine library's implicit coro::self& parameter and saves it, but
+// does not pass it down to the caller's callable.
void LLCoros::toplevel(coro::self& self, CoroData* data, const callable_t& callable)
{
// capture the 'self' param in CoroData
@@ -254,8 +298,8 @@ void LLCoros::toplevel(coro::self& self, CoroData* data, const callable_t& calla
CRASH_ON_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << data->mName));
}
// This cleanup isn't perfectly symmetrical with the way we initially set
- // data->mPrev, but this is our last chance to reset mCurrentCoro.
- sCurrentCoro.reset(data->mPrev);
+ // data->mPrev, but this is our last chance to reset Current.
+ Current().reset(data->mPrev);
}
/*****************************************************************************
@@ -278,7 +322,7 @@ LLCoros::CoroData::CoroData(CoroData* prev, const std::string& name,
mPrev(prev),
mName(name),
// Wrap the caller's callable in our toplevel() function so we can manage
- // sCurrentCoro appropriately at startup and shutdown of each coroutine.
+ // Current appropriately at startup and shutdown of each coroutine.
mCoro(boost::bind(toplevel, _1, this, callable), stacksize),
// don't consume events unless specifically directed
mConsuming(false),
@@ -289,13 +333,13 @@ LLCoros::CoroData::CoroData(CoroData* prev, const std::string& name,
std::string LLCoros::launch(const std::string& prefix, const callable_t& callable)
{
std::string name(generateDistinctName(prefix));
- // pass the current value of sCurrentCoro as previous context
- CoroData* newCoro = new CoroData(sCurrentCoro.get(), name,
- callable, mStackSize);
+ Current current;
+ // pass the current value of Current as previous context
+ CoroData* newCoro = new CoroData(current, name, callable, mStackSize);
// Store it in our pointer map
mCoros.insert(name, newCoro);
// also set it as current
- sCurrentCoro.reset(newCoro);
+ current.reset(newCoro);
/* Run the coroutine until its first wait, then return here */
(newCoro->mCoro)(std::nothrow);
return name;
diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h
index 39316ed0e6..bbe2d22af4 100644
--- a/indra/llcommon/llcoros.h
+++ b/indra/llcommon/llcoros.h
@@ -35,8 +35,10 @@
#include <boost/ptr_container/ptr_map.hpp>
#include <boost/function.hpp>
#include <boost/thread/tss.hpp>
+#include <boost/noncopyable.hpp>
#include <string>
#include <stdexcept>
+#include "llcoro_get_id.h" // for friend declaration
// forward-declare helper class
namespace llcoro
@@ -83,6 +85,7 @@ class Suspending;
*/
class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>
{
+ LLSINGLETON(LLCoros);
public:
/// Canonical boost::dcoroutines::coroutine signature we use
typedef boost::dcoroutines::coroutine<void()> coro;
@@ -173,9 +176,8 @@ public:
class Future;
private:
- LLCoros();
- friend class LLSingleton<LLCoros>;
friend class llcoro::Suspending;
+ friend llcoro::id llcoro::get_id();
std::string generateDistinctName(const std::string& prefix) const;
bool cleanup(const LLSD&);
struct CoroData;
@@ -222,8 +224,22 @@ private:
typedef boost::ptr_map<std::string, CoroData> CoroMap;
CoroMap mCoros;
- // identify the current coroutine's CoroData
- static boost::thread_specific_ptr<LLCoros::CoroData> sCurrentCoro;
+ // Identify the current coroutine's CoroData. Use a little helper class so
+ // a caller can either use a temporary instance, or instantiate a named
+ // variable and access it multiple times.
+ class Current
+ {
+ public:
+ Current();
+
+ operator LLCoros::CoroData*() { return get(); }
+ LLCoros::CoroData* operator->() { return get(); }
+ LLCoros::CoroData* get() { return mCurrent->get(); }
+ void reset(LLCoros::CoroData* ptr) { mCurrent->reset(ptr); }
+
+ private:
+ boost::thread_specific_ptr<LLCoros::CoroData>* mCurrent;
+ };
};
namespace llcoro
@@ -231,7 +247,7 @@ namespace llcoro
/// Instantiate one of these in a block surrounding any leaf point when
/// control literally switches away from this coroutine.
-class Suspending
+class Suspending: boost::noncopyable
{
public:
Suspending();
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index 7887a942e9..e6407ecf22 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -239,6 +239,14 @@ namespace
{
std::string className(const std::type_info& type)
{
+ return LLError::Log::demangle(type.name());
+ }
+} // anonymous
+
+namespace LLError
+{
+ std::string Log::demangle(const char* mangled)
+ {
#ifdef __GNUC__
// GCC: type_info::name() returns a mangled class name,st demangle
@@ -252,31 +260,34 @@ namespace
// but gcc 3.3 libstc++'s implementation of demangling is broken
// and fails without.
- char* name = abi::__cxa_demangle(type.name(),
+ char* name = abi::__cxa_demangle(mangled,
abi_name_buf, &abi_name_len, &status);
// this call can realloc the abi_name_buf pointer (!)
- return name ? name : type.name();
+ return name ? name : mangled;
#elif LL_WINDOWS
// DevStudio: type_info::name() includes the text "class " at the start
static const std::string class_prefix = "class ";
-
- std::string name = type.name();
- std::string::size_type p = name.find(class_prefix);
- if (p == std::string::npos)
+ std::string name = mangled;
+ if (0 != name.compare(0, class_prefix.length(), class_prefix))
{
+ LL_DEBUGS() << "Did not see '" << class_prefix << "' prefix on '"
+ << name << "'" << LL_ENDL;
return name;
}
- return name.substr(p + class_prefix.size());
+ return name.substr(class_prefix.length());
-#else
- return type.name();
+#else
+ return mangled;
#endif
}
+} // LLError
+namespace
+{
std::string functionName(const std::string& preprocessor_name)
{
#if LL_WINDOWS
@@ -363,9 +374,8 @@ namespace
class Globals : public LLSingleton<Globals>
{
+ LLSINGLETON(Globals);
public:
- Globals();
-
std::ostringstream messageStream;
bool messageStreamInUse;
@@ -438,11 +448,10 @@ namespace LLError
class Settings : public LLSingleton<Settings>
{
+ LLSINGLETON(Settings);
public:
- Settings();
-
SettingsConfigPtr getSettingsConfig();
-
+
void reset();
SettingsStoragePtr saveAndReset();
void restore(SettingsStoragePtr pSettingsStorage);
@@ -450,7 +459,7 @@ namespace LLError
private:
SettingsConfigPtr mSettingsConfig;
};
-
+
SettingsConfig::SettingsConfig()
: LLRefCount(),
mPrintLocation(false),
@@ -475,8 +484,7 @@ namespace LLError
mRecorders.clear();
}
- Settings::Settings()
- : LLSingleton<Settings>(),
+ Settings::Settings():
mSettingsConfig(new SettingsConfig())
{
}
@@ -485,26 +493,31 @@ namespace LLError
{
return mSettingsConfig;
}
-
+
void Settings::reset()
{
Globals::getInstance()->invalidateCallSites();
mSettingsConfig = new SettingsConfig();
}
-
+
SettingsStoragePtr Settings::saveAndReset()
{
SettingsStoragePtr oldSettingsConfig(mSettingsConfig.get());
reset();
return oldSettingsConfig;
}
-
+
void Settings::restore(SettingsStoragePtr pSettingsStorage)
{
Globals::getInstance()->invalidateCallSites();
SettingsConfigPtr newSettingsConfig(dynamic_cast<SettingsConfig *>(pSettingsStorage.get()));
mSettingsConfig = newSettingsConfig;
}
+
+ bool is_available()
+ {
+ return Settings::instanceExists() && Globals::instanceExists();
+ }
}
namespace LLError
diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h
index 3573b3f44e..ceb1fd2c5f 100644
--- a/indra/llcommon/llerror.h
+++ b/indra/llcommon/llerror.h
@@ -190,6 +190,7 @@ namespace LLError
static std::ostringstream* out();
static void flush(std::ostringstream* out, char* message);
static void flush(std::ostringstream*, const CallSite&);
+ static std::string demangle(const char* mangled);
};
struct LL_COMMON_API CallSite
diff --git a/indra/llcommon/llerrorcontrol.h b/indra/llcommon/llerrorcontrol.h
index 56ac52e5de..56e84f7172 100644
--- a/indra/llcommon/llerrorcontrol.h
+++ b/indra/llcommon/llerrorcontrol.h
@@ -189,6 +189,11 @@ namespace LLError
LL_COMMON_API std::string abbreviateFile(const std::string& filePath);
LL_COMMON_API int shouldLogCallCount();
+
+ // Check whether Globals exists. This should only be used by LLSingleton
+ // infrastructure to avoid trying to log when our internal LLSingleton is
+ // unavailable -- circularity ensues.
+ LL_COMMON_API bool is_available();
};
#endif // LL_LLERRORCONTROL_H
diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h
index a3b9ec02e0..7cff7dfd45 100644
--- a/indra/llcommon/llevents.h
+++ b/indra/llcommon/llevents.h
@@ -229,7 +229,7 @@ class LLEventPump;
*/
class LL_COMMON_API LLEventPumps: public LLSingleton<LLEventPumps>
{
- friend class LLSingleton<LLEventPumps>;
+ LLSINGLETON(LLEventPumps);
public:
/**
* Find or create an LLEventPump instance with a specific name. We return
@@ -272,7 +272,6 @@ private:
void unregister(const LLEventPump&);
private:
- LLEventPumps();
~LLEventPumps();
testable:
diff --git a/indra/llcommon/llfile.cpp b/indra/llcommon/llfile.cpp
index 873a7bce25..7b559861bb 100644
--- a/indra/llcommon/llfile.cpp
+++ b/indra/llcommon/llfile.cpp
@@ -239,7 +239,7 @@ int LLFile::close(LLFILE * file)
}
-int LLFile::remove(const std::string& filename)
+int LLFile::remove(const std::string& filename, int supress_error)
{
#if LL_WINDOWS
std::string utf8filename = filename;
@@ -248,7 +248,7 @@ int LLFile::remove(const std::string& filename)
#else
int rc = ::remove(filename.c_str());
#endif
- return warnif("remove", filename, rc);
+ return warnif("remove", filename, rc, supress_error);
}
int LLFile::rename(const std::string& filename, const std::string& newname)
diff --git a/indra/llcommon/llfile.h b/indra/llcommon/llfile.h
index 3e25228aeb..d8f84daf2b 100644
--- a/indra/llcommon/llfile.h
+++ b/indra/llcommon/llfile.h
@@ -72,7 +72,7 @@ public:
static int mkdir(const std::string& filename, int perms = 0700);
static int rmdir(const std::string& filename);
- static int remove(const std::string& filename);
+ static int remove(const std::string& filename, int supress_error = 0);
static int rename(const std::string& filename,const std::string& newname);
static bool copy(const std::string from, const std::string to);
diff --git a/indra/llcommon/llheteromap.cpp b/indra/llcommon/llheteromap.cpp
new file mode 100644
index 0000000000..7c19196e0c
--- /dev/null
+++ b/indra/llcommon/llheteromap.cpp
@@ -0,0 +1,32 @@
+/**
+ * @file llheteromap.cpp
+ * @author Nat Goodspeed
+ * @date 2016-10-12
+ * @brief Implementation for llheteromap.
+ *
+ * $LicenseInfo:firstyear=2016&license=viewerlgpl$
+ * Copyright (c) 2016, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llheteromap.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+
+LLHeteroMap::~LLHeteroMap()
+{
+ // For each entry in our map, we must call its deleter, which is the only
+ // record we have of its original type.
+ for (TypeMap::iterator mi(mMap.begin()), me(mMap.end()); mi != me; ++mi)
+ {
+ // mi->second is the std::pair; mi->second.first is the void*;
+ // mi->second.second points to the deleter function
+ (mi->second.second)(mi->second.first);
+ mi->second.first = NULL;
+ }
+}
diff --git a/indra/llcommon/llheteromap.h b/indra/llcommon/llheteromap.h
new file mode 100644
index 0000000000..9d6f303d08
--- /dev/null
+++ b/indra/llcommon/llheteromap.h
@@ -0,0 +1,95 @@
+/**
+ * @file llheteromap.h
+ * @author Nat Goodspeed
+ * @date 2016-10-12
+ * @brief Map capable of storing objects of diverse types, looked up by type.
+ *
+ * $LicenseInfo:firstyear=2016&license=viewerlgpl$
+ * Copyright (c) 2016, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLHETEROMAP_H)
+#define LL_LLHETEROMAP_H
+
+#include <typeinfo>
+#include <utility> // std::pair
+#include <map>
+
+/**
+ * LLHeteroMap addresses an odd requirement. Usually when you want to put
+ * objects of different classes into a runtime collection of any kind, you
+ * derive them all from a common base class and store pointers to that common
+ * base class.
+ *
+ * LLInitParam::BaseBlock uses disturbing raw-pointer arithmetic to find data
+ * members in its subclasses. It seems that no BaseBlock subclass can be
+ * stored in a polymorphic class of any kind: the presence of a vtbl pointer
+ * in the layout silently throws off the reinterpret_cast arithmetic. Bad
+ * Things result. (Many thanks to Nicky D for this analysis!)
+ *
+ * LLHeteroMap collects objects WITHOUT a common base class, retrieves them by
+ * object type and destroys them when the LLHeteroMap is destroyed.
+ */
+class LLHeteroMap
+{
+public:
+ ~LLHeteroMap();
+
+ /// find or create
+ template <class T>
+ T& obtain()
+ {
+ // Look up map entry by typeid(T). We don't simply use mMap[typeid(T)]
+ // because that requires default-constructing T on every lookup. For
+ // some kinds of T, that could be expensive.
+ TypeMap::iterator found = mMap.find(&typeid(T));
+ if (found == mMap.end())
+ {
+ // Didn't find typeid(T). Create an entry. Because we're storing
+ // only a void* in the map, discarding type information, make sure
+ // we capture that type information in our deleter.
+ void* ptr = new T();
+ void (*dlfn)(void*) = &deleter<T>;
+ std::pair<TypeMap::iterator, bool> inserted =
+ mMap.insert(TypeMap::value_type(&typeid(T),
+ TypeMap::mapped_type(ptr, dlfn)));
+ // Okay, now that we have an entry, claim we found it.
+ found = inserted.first;
+ }
+ // found->second is the std::pair; second.first is the void*
+ // pointer to the object in question. Cast it to correct type and
+ // dereference it.
+ return *(static_cast<T*>(found->second.first));
+ }
+
+private:
+ template <class T>
+ static
+ void deleter(void* p)
+ {
+ delete static_cast<T*>(p);
+ }
+
+ // Comparing two std::type_info* values is tricky, because the standard
+ // does not guarantee that there will be only one type_info instance for a
+ // given type. In other words, &typeid(A) in one part of the program may
+ // not always equal &typeid(A) in some other part. Use special comparator.
+ struct type_info_ptr_comp
+ {
+ bool operator()(const std::type_info* lhs, const std::type_info* rhs)
+ {
+ return lhs->before(*rhs);
+ }
+ };
+
+ // What we actually store is a map from std::type_info (permitting lookup
+ // by object type) to a void* pointer to the object PLUS its deleter.
+ typedef std::map<
+ const std::type_info*, std::pair<void*, void (*)(void*)>,
+ type_info_ptr_comp>
+ TypeMap;
+ TypeMap mMap;
+};
+
+#endif /* ! defined(LL_LLHETEROMAP_H) */
diff --git a/indra/llcommon/llinitdestroyclass.cpp b/indra/llcommon/llinitdestroyclass.cpp
new file mode 100644
index 0000000000..e6382a7924
--- /dev/null
+++ b/indra/llcommon/llinitdestroyclass.cpp
@@ -0,0 +1,30 @@
+/**
+ * @file llinitdestroyclass.cpp
+ * @author Nat Goodspeed
+ * @date 2016-08-30
+ * @brief Implementation for llinitdestroyclass.
+ *
+ * $LicenseInfo:firstyear=2016&license=viewerlgpl$
+ * Copyright (c) 2016, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llinitdestroyclass.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llerror.h"
+
+void LLCallbackRegistry::fireCallbacks() const
+{
+ for (FuncList::const_iterator fi = mCallbacks.begin(), fe = mCallbacks.end();
+ fi != fe; ++fi)
+ {
+ LL_INFOS("LLInitDestroyClass") << "calling " << fi->first << "()" << LL_ENDL;
+ fi->second();
+ }
+}
diff --git a/indra/llcommon/llinitdestroyclass.h b/indra/llcommon/llinitdestroyclass.h
new file mode 100644
index 0000000000..5f979614fe
--- /dev/null
+++ b/indra/llcommon/llinitdestroyclass.h
@@ -0,0 +1,175 @@
+/**
+ * @file llinitdestroyclass.h
+ * @author Nat Goodspeed
+ * @date 2015-05-27
+ * @brief LLInitClass / LLDestroyClass mechanism
+ *
+ * The LLInitClass template, extracted from llui.h, ensures that control will
+ * reach a static initClass() method. LLDestroyClass does the same for a
+ * static destroyClass() method.
+ *
+ * The distinguishing characteristics of these templates are:
+ *
+ * - All LLInitClass<T>::initClass() methods are triggered by an explicit call
+ * to LLInitClassList::instance().fireCallbacks(). Presumably this call
+ * happens sometime after all static objects in the program have been
+ * initialized. In other words, each LLInitClass<T>::initClass() method
+ * should be able to make some assumptions about global program state.
+ *
+ * - Similarly, LLDestroyClass<T>::destroyClass() methods are triggered by
+ * LLDestroyClassList::instance().fireCallbacks(). Again, presumably this
+ * happens at a well-defined moment in the program's shutdown sequence.
+ *
+ * - The initClass() calls happen in an unspecified sequence. You may not rely
+ * on the relative ordering of LLInitClass<T>::initClass() versus another
+ * LLInitClass<U>::initClass() method. If you need such a guarantee, use
+ * LLSingleton instead and make the dependency explicit.
+ *
+ * - Similarly, LLDestroyClass<T>::destroyClass() may happen either before or
+ * after LLDestroyClass<U>::destroyClass(). You cannot rely on that order.
+ *
+ * $LicenseInfo:firstyear=2015&license=viewerlgpl$
+ * Copyright (c) 2015, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLINITDESTROYCLASS_H)
+#define LL_LLINITDESTROYCLASS_H
+
+#include "llsingleton.h"
+#include <boost/function.hpp>
+#include <typeinfo>
+#include <vector>
+#include <utility> // std::pair
+
+/**
+ * LLCallbackRegistry is an implementation detail base class for
+ * LLInitClassList and LLDestroyClassList. It accumulates the initClass() or
+ * destroyClass() callbacks for registered classes.
+ */
+class LLCallbackRegistry
+{
+public:
+ typedef boost::function<void()> func_t;
+
+ void registerCallback(const std::string& name, const func_t& func)
+ {
+ mCallbacks.push_back(FuncList::value_type(name, func));
+ }
+
+ void fireCallbacks() const;
+
+private:
+ // Arguably this should be a boost::signals2::signal, which is, after all,
+ // a sequence of callables. We manage it by hand so we can log a name for
+ // each registered function we call.
+ typedef std::vector< std::pair<std::string, func_t> > FuncList;
+ FuncList mCallbacks;
+};
+
+/**
+ * LLInitClassList is the LLCallbackRegistry for LLInitClass. It stores the
+ * registered initClass() methods. It must be an LLSingleton because
+ * LLInitClass registers its initClass() method at static construction time
+ * (before main()), requiring LLInitClassList to be fully constructed on
+ * demand regardless of module initialization order.
+ */
+class LLInitClassList :
+ public LLCallbackRegistry,
+ public LLSingleton<LLInitClassList>
+{
+ LLSINGLETON_EMPTY_CTOR(LLInitClassList);
+};
+
+/**
+ * LLDestroyClassList is the LLCallbackRegistry for LLDestroyClass. It stores
+ * the registered destroyClass() methods. It must be an LLSingleton because
+ * LLDestroyClass registers its destroyClass() method at static construction
+ * time (before main()), requiring LLDestroyClassList to be fully constructed
+ * on demand regardless of module initialization order.
+ */
+class LLDestroyClassList :
+ public LLCallbackRegistry,
+ public LLSingleton<LLDestroyClassList>
+{
+ LLSINGLETON_EMPTY_CTOR(LLDestroyClassList);
+};
+
+/**
+ * LLRegisterWith is an implementation detail for LLInitClass and
+ * LLDestroyClass. It is intended to be used as a static class member whose
+ * constructor registers the specified callback with the LLMumbleClassList
+ * singleton registry specified as the template argument.
+ */
+template<typename T>
+class LLRegisterWith
+{
+public:
+ LLRegisterWith(const std::string& name, const LLCallbackRegistry::func_t& func)
+ {
+ T::instance().registerCallback(name, func);
+ }
+
+ // this avoids a MSVC bug where non-referenced static members are "optimized" away
+ // even if their constructors have side effects
+ S32 reference()
+ {
+ S32 dummy;
+ dummy = 0;
+ return dummy;
+ }
+};
+
+/**
+ * Derive MyClass from LLInitClass<MyClass> (the Curiously Recurring Template
+ * Pattern) to ensure that the static method MyClass::initClass() will be
+ * called (along with all other LLInitClass<T> subclass initClass() methods)
+ * when someone calls LLInitClassList::instance().fireCallbacks(). This gives
+ * the application specific control over the timing of all such
+ * initializations, without having to insert calls for every such class into
+ * generic application code.
+ */
+template<typename T>
+class LLInitClass
+{
+public:
+ LLInitClass() { sRegister.reference(); }
+
+ // When this static member is initialized, the subclass initClass() method
+ // is registered on LLInitClassList. See sRegister definition below.
+ static LLRegisterWith<LLInitClassList> sRegister;
+};
+
+/**
+ * Derive MyClass from LLDestroyClass<MyClass> (the Curiously Recurring
+ * Template Pattern) to ensure that the static method MyClass::destroyClass()
+ * will be called (along with other LLDestroyClass<T> subclass destroyClass()
+ * methods) when someone calls LLDestroyClassList::instance().fireCallbacks().
+ * This gives the application specific control over the timing of all such
+ * cleanup calls, without having to insert calls for every such class into
+ * generic application code.
+ */
+template<typename T>
+class LLDestroyClass
+{
+public:
+ LLDestroyClass() { sRegister.reference(); }
+
+ // When this static member is initialized, the subclass destroyClass()
+ // method is registered on LLInitClassList. See sRegister definition
+ // below.
+ static LLRegisterWith<LLDestroyClassList> sRegister;
+};
+
+// Here's where LLInitClass<T> specifies the subclass initClass() method.
+template <typename T>
+LLRegisterWith<LLInitClassList>
+LLInitClass<T>::sRegister(std::string(typeid(T).name()) + "::initClass",
+ &T::initClass);
+// Here's where LLDestroyClass<T> specifies the subclass destroyClass() method.
+template <typename T>
+LLRegisterWith<LLDestroyClassList>
+LLDestroyClass<T>::sRegister(std::string(typeid(T).name()) + "::destroyClass",
+ &T::destroyClass);
+
+#endif /* ! defined(LL_LLINITDESTROYCLASS_H) */
diff --git a/indra/llcommon/llinitparam.cpp b/indra/llcommon/llinitparam.cpp
index aa2f4eb289..1d104cf55d 100644
--- a/indra/llcommon/llinitparam.cpp
+++ b/indra/llcommon/llinitparam.cpp
@@ -193,7 +193,12 @@ namespace LLInitParam
{
if (!silent)
{
- p.parserWarning(llformat("Failed to parse parameter \"%s\"", p.getCurrentElementName().c_str()));
+ std::string file_name = p.getCurrentFileName();
+ if(!file_name.empty())
+ {
+ file_name = "in file: " + file_name;
+ }
+ p.parserWarning(llformat("Failed to parse parameter \"%s\" %s", p.getCurrentElementName().c_str(), file_name.c_str()));
}
return false;
}
diff --git a/indra/llcommon/llinitparam.h b/indra/llcommon/llinitparam.h
index c65b05f610..f1f4226c40 100644
--- a/indra/llcommon/llinitparam.h
+++ b/indra/llcommon/llinitparam.h
@@ -551,6 +551,7 @@ namespace LLInitParam
}
virtual std::string getCurrentElementName() = 0;
+ virtual std::string getCurrentFileName() = 0;
virtual void parserWarning(const std::string& message);
virtual void parserError(const std::string& message);
void setParseSilently(bool silent) { mParseSilently = silent; }
diff --git a/indra/llcommon/llmetricperformancetester.cpp b/indra/llcommon/llmetricperformancetester.cpp
index 1fc821d9a9..16fc365da1 100644
--- a/indra/llcommon/llmetricperformancetester.cpp
+++ b/indra/llcommon/llmetricperformancetester.cpp
@@ -40,7 +40,7 @@
LLMetricPerformanceTesterBasic::name_tester_map_t LLMetricPerformanceTesterBasic::sTesterMap ;
/*static*/
-void LLMetricPerformanceTesterBasic::cleanClass()
+void LLMetricPerformanceTesterBasic::cleanupClass()
{
for (name_tester_map_t::iterator iter = sTesterMap.begin() ; iter != sTesterMap.end() ; ++iter)
{
diff --git a/indra/llcommon/llmetricperformancetester.h b/indra/llcommon/llmetricperformancetester.h
index 1a18cdf36f..e6b46be1cf 100644
--- a/indra/llcommon/llmetricperformancetester.h
+++ b/indra/llcommon/llmetricperformancetester.h
@@ -156,7 +156,7 @@ public:
/**
* @brief Delete all testers and reset the tester map
*/
- static void cleanClass() ;
+ static void cleanupClass() ;
private:
// Add a tester to the map. Returns false if adding fails.
diff --git a/indra/llcommon/llpounceable.h b/indra/llcommon/llpounceable.h
new file mode 100644
index 0000000000..0421ce966a
--- /dev/null
+++ b/indra/llcommon/llpounceable.h
@@ -0,0 +1,216 @@
+/**
+ * @file llpounceable.h
+ * @author Nat Goodspeed
+ * @date 2015-05-22
+ * @brief LLPounceable is tangentially related to a future: it's a holder for
+ * a value that may or may not exist yet. Unlike a future, though,
+ * LLPounceable freely allows reading the held value. (If the held
+ * type T does not have a distinguished "empty" value, consider using
+ * LLPounceable<boost::optional<T>>.)
+ *
+ * LLPounceable::callWhenReady() is this template's claim to fame. It
+ * allows its caller to "pounce" on the held value as soon as it
+ * becomes non-empty. Call callWhenReady() with any C++ callable
+ * accepting T. If the held value is already non-empty, callWhenReady()
+ * will immediately call the callable with the held value. If the held
+ * value is empty, though, callWhenReady() will enqueue the callable
+ * for later. As soon as LLPounceable is assigned a non-empty held
+ * value, it will flush the queue of deferred callables.
+ *
+ * Consider a global LLMessageSystem* gMessageSystem. Message system
+ * initialization happens at a very specific point during viewer
+ * initialization. Other subsystems want to register callbacks on the
+ * LLMessageSystem instance as soon as it's initialized, but their own
+ * initialization may precede that. If we define gMessageSystem to be
+ * an LLPounceable<LLMessageSystem*>, a subsystem can use
+ * callWhenReady() to either register immediately (if gMessageSystem
+ * is already up and runnning) or register as soon as gMessageSystem
+ * is set with a new, initialized instance.
+ *
+ * $LicenseInfo:firstyear=2015&license=viewerlgpl$
+ * Copyright (c) 2015, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLPOUNCEABLE_H)
+#define LL_LLPOUNCEABLE_H
+
+#include "llsingleton.h"
+#include <boost/noncopyable.hpp>
+#include <boost/call_traits.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/utility/value_init.hpp>
+#include <boost/unordered_map.hpp>
+#include <boost/signals2/signal.hpp>
+
+// Forward declare the user template, since we want to be able to point to it
+// in some of its implementation classes.
+template <typename T, class TAG>
+class LLPounceable;
+
+template <typename T, typename TAG>
+struct LLPounceableTraits
+{
+ // Our "queue" is a signal object with correct signature.
+ typedef boost::signals2::signal<void (typename boost::call_traits<T>::param_type)> signal_t;
+ // Call callWhenReady() with any callable accepting T.
+ typedef typename signal_t::slot_type func_t;
+ // owner pointer type
+ typedef LLPounceable<T, TAG>* owner_ptr;
+};
+
+// Tag types distinguish the two different implementations of LLPounceable's
+// queue.
+struct LLPounceableQueue {};
+struct LLPounceableStatic {};
+
+// generic LLPounceableQueueImpl deliberately omitted: only the above tags are
+// legal
+template <typename T, class TAG>
+class LLPounceableQueueImpl;
+
+// The implementation selected by LLPounceableStatic uses an LLSingleton
+// because we can't count on a data member queue being initialized at the time
+// we start getting callWhenReady() calls. This is that LLSingleton.
+template <typename T>
+class LLPounceableQueueSingleton:
+ public LLSingleton<LLPounceableQueueSingleton<T> >
+{
+ LLSINGLETON_EMPTY_CTOR(LLPounceableQueueSingleton);
+
+ typedef LLPounceableTraits<T, LLPounceableStatic> traits;
+ typedef typename traits::owner_ptr owner_ptr;
+ typedef typename traits::signal_t signal_t;
+
+ // For a given held type T, every LLPounceable<T, LLPounceableStatic>
+ // instance will call on the SAME LLPounceableQueueSingleton instance --
+ // given how class statics work. We must keep a separate queue for each
+ // LLPounceable instance. Use a hash map for that.
+ typedef boost::unordered_map<owner_ptr, signal_t> map_t;
+
+public:
+ // Disambiguate queues belonging to different LLPounceables.
+ signal_t& get(owner_ptr owner)
+ {
+ // operator[] has find-or-create semantics -- just what we want!
+ return mMap[owner];
+ }
+
+private:
+ map_t mMap;
+};
+
+// LLPounceableQueueImpl that uses the above LLSingleton
+template <typename T>
+class LLPounceableQueueImpl<T, LLPounceableStatic>
+{
+public:
+ typedef LLPounceableTraits<T, LLPounceableStatic> traits;
+ typedef typename traits::owner_ptr owner_ptr;
+ typedef typename traits::signal_t signal_t;
+
+ signal_t& get(owner_ptr owner) const
+ {
+ // this Impl contains nothing; it delegates to the Singleton
+ return LLPounceableQueueSingleton<T>::instance().get(owner);
+ }
+};
+
+// The implementation selected by LLPounceableQueue directly contains the
+// queue of interest, suitable for an LLPounceable we can trust to be fully
+// initialized when it starts getting callWhenReady() calls.
+template <typename T>
+class LLPounceableQueueImpl<T, LLPounceableQueue>
+{
+public:
+ typedef LLPounceableTraits<T, LLPounceableQueue> traits;
+ typedef typename traits::owner_ptr owner_ptr;
+ typedef typename traits::signal_t signal_t;
+
+ signal_t& get(owner_ptr)
+ {
+ return mQueue;
+ }
+
+private:
+ signal_t mQueue;
+};
+
+// LLPounceable<T> is for an LLPounceable instance on the heap or the stack.
+// LLPounceable<T, LLPounceableStatic> is for a static LLPounceable instance.
+template <typename T, class TAG=LLPounceableQueue>
+class LLPounceable: public boost::noncopyable
+{
+private:
+ typedef LLPounceableTraits<T, TAG> traits;
+ typedef typename traits::owner_ptr owner_ptr;
+ typedef typename traits::signal_t signal_t;
+
+public:
+ typedef typename traits::func_t func_t;
+
+ // By default, both the initial value and the distinguished empty value
+ // are a default-constructed T instance. However you can explicitly
+ // specify each.
+ LLPounceable(typename boost::call_traits<T>::value_type init =boost::value_initialized<T>(),
+ typename boost::call_traits<T>::param_type empty=boost::value_initialized<T>()):
+ mHeld(init),
+ mEmpty(empty)
+ {}
+
+ // make read access to mHeld as cheap and transparent as possible
+ operator T () const { return mHeld; }
+ typename boost::remove_pointer<T>::type operator*() const { return *mHeld; }
+ typename boost::call_traits<T>::value_type operator->() const { return mHeld; }
+ // uncomment 'explicit' as soon as we allow C++11 compilation
+ /*explicit*/ operator bool() const { return bool(mHeld); }
+ bool operator!() const { return ! mHeld; }
+
+ // support both assignment (dumb ptr idiom) and reset() (smart ptr)
+ void operator=(typename boost::call_traits<T>::param_type value)
+ {
+ reset(value);
+ }
+
+ void reset(typename boost::call_traits<T>::param_type value)
+ {
+ mHeld = value;
+ // If this new value is non-empty, flush anything pending in the queue.
+ if (mHeld != mEmpty)
+ {
+ signal_t& signal(get_signal());
+ signal(mHeld);
+ signal.disconnect_all_slots();
+ }
+ }
+
+ // our claim to fame
+ void callWhenReady(const func_t& func)
+ {
+ if (mHeld != mEmpty)
+ {
+ // If the held value is already non-empty, immediately call func()
+ func(mHeld);
+ }
+ else
+ {
+ // Held value still empty, queue func() for later. By default,
+ // connect() enqueues slots in FIFO order.
+ get_signal().connect(func);
+ }
+ }
+
+private:
+ signal_t& get_signal() { return mQueue.get(this); }
+
+ // Store both the current and the empty value.
+ // MAYBE: Might be useful to delegate to LLPounceableTraits the meaning of
+ // testing for "empty." For some types we want operator!(); for others we
+ // want to compare to a distinguished value.
+ typename boost::call_traits<T>::value_type mHeld, mEmpty;
+ // This might either contain the queue (LLPounceableQueue) or delegate to
+ // an LLSingleton (LLPounceableStatic).
+ LLPounceableQueueImpl<T, TAG> mQueue;
+};
+
+#endif /* ! defined(LL_LLPOUNCEABLE_H) */
diff --git a/indra/llcommon/llregistry.h b/indra/llcommon/llregistry.h
index 29950c108d..750fe9fdc8 100644
--- a/indra/llcommon/llregistry.h
+++ b/indra/llcommon/llregistry.h
@@ -247,7 +247,10 @@ class LLRegistrySingleton
: public LLRegistry<KEY, VALUE, COMPARATOR>,
public LLSingleton<DERIVED_TYPE>
{
- friend class LLSingleton<DERIVED_TYPE>;
+ // This LLRegistrySingleton doesn't use LLSINGLETON(LLRegistrySingleton)
+ // because the concrete class is actually DERIVED_TYPE, not
+ // LLRegistrySingleton. So each concrete subclass needs
+ // LLSINGLETON(whatever) -- not this intermediate base class.
public:
typedef LLRegistry<KEY, VALUE, COMPARATOR> registry_t;
typedef const KEY& ref_const_key_t;
@@ -269,7 +272,7 @@ public:
~ScopedRegistrar()
{
- if (!singleton_t::destroyed())
+ if (singleton_t::instanceExists())
{
popScope();
}
diff --git a/indra/llcommon/llsdparam.h b/indra/llcommon/llsdparam.h
index 09f1bdf1e3..93910b70ae 100644
--- a/indra/llcommon/llsdparam.h
+++ b/indra/llcommon/llsdparam.h
@@ -66,6 +66,7 @@ public:
}
/*virtual*/ std::string getCurrentElementName();
+ /*virtual*/ std::string getCurrentFileName(){ return LLStringUtil::null; }
private:
void writeSDImpl(LLSD& sd,
diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp
index d49ff0feb5..81ba8631c6 100644
--- a/indra/llcommon/llsdserialize.cpp
+++ b/indra/llcommon/llsdserialize.cpp
@@ -1200,6 +1200,7 @@ bool LLSDBinaryParser::parseString(
read(istr, (char*)&value_nbo, sizeof(U32)); /*Flawfinder: ignore*/
S32 size = (S32)ntohl(value_nbo);
if(mCheckLimits && (size > mMaxBytesLeft)) return false;
+ if(size < 0) return false;
std::vector<char> buf;
if(size)
{
diff --git a/indra/llcommon/llsingleton.cpp b/indra/llcommon/llsingleton.cpp
index 9b49e52377..9025e53bb2 100644
--- a/indra/llcommon/llsingleton.cpp
+++ b/indra/llcommon/llsingleton.cpp
@@ -25,7 +25,445 @@
*/
#include "linden_common.h"
-
#include "llsingleton.h"
+#include "llerror.h"
+#include "llerrorcontrol.h" // LLError::is_available()
+#include "lldependencies.h"
+#include "llcoro_get_id.h"
+#include <boost/foreach.hpp>
+#include <boost/unordered_map.hpp>
+#include <algorithm>
+#include <iostream> // std::cerr in dire emergency
+#include <sstream>
+#include <stdexcept>
+
+namespace {
+void log(LLError::ELevel level,
+ const char* p1, const char* p2, const char* p3, const char* p4);
+
+void logdebugs(const char* p1="", const char* p2="", const char* p3="", const char* p4="");
+
+bool oktolog();
+} // anonymous namespace
+
+// Our master list of all LLSingletons is itself an LLSingleton. We used to
+// store it in a function-local static, but that could get destroyed before
+// the last of the LLSingletons -- and ~LLSingletonBase() definitely wants to
+// remove itself from the master list. Since the whole point of this master
+// list is to help track inter-LLSingleton dependencies, and since we have
+// this implicit dependency from every LLSingleton to the master list, make it
+// an LLSingleton.
+class LLSingletonBase::MasterList:
+ public LLSingleton<LLSingletonBase::MasterList>
+{
+ LLSINGLETON_EMPTY_CTOR(MasterList);
+
+public:
+ // No need to make this private with accessors; nobody outside this source
+ // file can see it.
+
+ // This is the master list of all instantiated LLSingletons (save the
+ // MasterList itself) in arbitrary order. You MUST call dep_sort() before
+ // traversing this list.
+ LLSingletonBase::list_t mMaster;
+
+ // We need to maintain a stack of LLSingletons currently being
+ // initialized, either in the constructor or in initSingleton(). However,
+ // managing that as a stack depends on having a DISTINCT 'initializing'
+ // stack for every C++ stack in the process! And we have a distinct C++
+ // stack for every running coroutine. It would be interesting and cool to
+ // implement a generic coroutine-local-storage mechanism and use that
+ // here. The trouble is that LLCoros is itself an LLSingleton, so
+ // depending on LLCoros functionality could dig us into infinite
+ // recursion. (Moreover, when we reimplement LLCoros on top of
+ // Boost.Fiber, that library already provides fiber_specific_ptr -- so
+ // it's not worth a great deal of time and energy implementing a generic
+ // equivalent on top of boost::dcoroutine, which is on its way out.)
+ // Instead, use a map of llcoro::id to select the appropriate
+ // coro-specific 'initializing' stack. llcoro::get_id() is carefully
+ // implemented to avoid requiring LLCoros.
+ typedef boost::unordered_map<llcoro::id, LLSingletonBase::list_t> InitializingMap;
+ InitializingMap mInitializing;
+
+ // non-static method, cf. LLSingletonBase::get_initializing()
+ list_t& get_initializing_()
+ {
+ // map::operator[] has find-or-create semantics, exactly what we need
+ // here. It returns a reference to the selected mapped_type instance.
+ return mInitializing[llcoro::get_id()];
+ }
+
+ void cleanup_initializing_()
+ {
+ InitializingMap::iterator found = mInitializing.find(llcoro::get_id());
+ if (found != mInitializing.end())
+ {
+ mInitializing.erase(found);
+ }
+ }
+};
+
+//static
+LLSingletonBase::list_t& LLSingletonBase::get_master()
+{
+ return LLSingletonBase::MasterList::instance().mMaster;
+}
+
+void LLSingletonBase::add_master()
+{
+ // As each new LLSingleton is constructed, add to the master list.
+ get_master().push_back(this);
+}
+
+void LLSingletonBase::remove_master()
+{
+ // When an LLSingleton is destroyed, remove from master list.
+ // add_master() used to capture the iterator to the newly-added list item
+ // so we could directly erase() it from the master list. Unfortunately
+ // that runs afoul of destruction-dependency order problems. So search the
+ // master list, and remove this item IF FOUND. We have few enough
+ // LLSingletons, and they are so rarely destroyed (once per run), that the
+ // cost of a linear search should not be an issue.
+ get_master().remove(this);
+}
+
+//static
+LLSingletonBase::list_t& LLSingletonBase::get_initializing()
+{
+ return LLSingletonBase::MasterList::instance().get_initializing_();
+}
+
+//static
+LLSingletonBase::list_t& LLSingletonBase::get_initializing_from(MasterList* master)
+{
+ return master->get_initializing_();
+}
+
+LLSingletonBase::~LLSingletonBase() {}
+
+void LLSingletonBase::push_initializing(const char* name)
+{
+ // log BEFORE pushing so logging singletons don't cry circularity
+ log_initializing("Pushing", name);
+ get_initializing().push_back(this);
+}
+
+void LLSingletonBase::pop_initializing()
+{
+ list_t& list(get_initializing());
+
+ if (list.empty())
+ {
+ logerrs("Underflow in stack of currently-initializing LLSingletons at ",
+ demangle(typeid(*this).name()).c_str(), "::getInstance()");
+ }
+
+ // Now we know list.back() exists: capture it
+ LLSingletonBase* back(list.back());
+ // and pop it
+ list.pop_back();
+
+ // The viewer launches an open-ended number of coroutines. While we don't
+ // expect most of them to initialize LLSingleton instances, our present
+ // get_initializing() logic could lead to an open-ended number of map
+ // entries. So every time we pop the stack back to empty, delete the entry
+ // entirely.
+ if (list.empty())
+ {
+ MasterList::instance().cleanup_initializing_();
+ }
+
+ // Now validate the newly-popped LLSingleton.
+ if (back != this)
+ {
+ logerrs("Push/pop mismatch in stack of currently-initializing LLSingletons: ",
+ demangle(typeid(*this).name()).c_str(), "::getInstance() trying to pop ",
+ demangle(typeid(*back).name()).c_str());
+ }
+
+ // log AFTER popping so logging singletons don't cry circularity
+ log_initializing("Popping", typeid(*back).name());
+}
+
+//static
+void LLSingletonBase::log_initializing(const char* verb, const char* name)
+{
+ if (oktolog())
+ {
+ LL_DEBUGS("LLSingleton") << verb << ' ' << demangle(name) << ';';
+ list_t& list(get_initializing());
+ for (list_t::const_reverse_iterator ri(list.rbegin()), rend(list.rend());
+ ri != rend; ++ri)
+ {
+ LLSingletonBase* sb(*ri);
+ LL_CONT << ' ' << demangle(typeid(*sb).name());
+ }
+ LL_ENDL;
+ }
+}
+
+void LLSingletonBase::capture_dependency(list_t& initializing, EInitState initState)
+{
+ // Did this getInstance() call come from another LLSingleton, or from
+ // vanilla application code? Note that although this is a nontrivial
+ // method, the vast majority of its calls arrive here with initializing
+ // empty().
+ if (! initializing.empty())
+ {
+ // getInstance() is being called by some other LLSingleton. But -- is
+ // this a circularity? That is, does 'this' already appear in the
+ // initializing stack?
+ // For what it's worth, normally 'initializing' should contain very
+ // few elements.
+ list_t::const_iterator found =
+ std::find(initializing.begin(), initializing.end(), this);
+ if (found != initializing.end())
+ {
+ // Report the circularity. Requiring the coder to dig through the
+ // logic to diagnose exactly how we got here is less than helpful.
+ std::ostringstream out;
+ for ( ; found != initializing.end(); ++found)
+ {
+ // 'found' is an iterator; *found is an LLSingletonBase*; **found
+ // is the actual LLSingletonBase instance.
+ LLSingletonBase* foundp(*found);
+ out << demangle(typeid(*foundp).name()) << " -> ";
+ }
+ // We promise to capture dependencies from both the constructor
+ // and the initSingleton() method, so an LLSingleton's instance
+ // pointer is on the initializing list during both. Now that we've
+ // detected circularity, though, we must distinguish the two. If
+ // the recursive call is from the constructor, we CAN'T honor it:
+ // otherwise we'd be returning a pointer to a partially-
+ // constructed object! But from initSingleton() is okay: that
+ // method exists specifically to support circularity.
+ // Decide which log helper to call based on initState. They have
+ // identical signatures.
+ ((initState == CONSTRUCTING)? logerrs : logwarns)
+ ("LLSingleton circularity: ", out.str().c_str(),
+ demangle(typeid(*this).name()).c_str(), "");
+ }
+ else
+ {
+ // Here 'this' is NOT already in the 'initializing' stack. Great!
+ // Record the dependency.
+ // initializing.back() is the LLSingletonBase* currently being
+ // initialized. Store 'this' in its mDepends set.
+ LLSingletonBase* current(initializing.back());
+ if (current->mDepends.insert(this).second)
+ {
+ // only log the FIRST time we hit this dependency!
+ logdebugs(demangle(typeid(*current).name()).c_str(),
+ " depends on ", demangle(typeid(*this).name()).c_str());
+ }
+ }
+ }
+}
+
+//static
+LLSingletonBase::vec_t LLSingletonBase::dep_sort()
+{
+ // While it would theoretically be possible to maintain a static
+ // SingletonDeps through the life of the program, dynamically adding and
+ // removing LLSingletons as they are created and destroyed, in practice
+ // it's less messy to construct it on demand. The overhead of doing so
+ // should happen basically twice: once for cleanupAll(), once for
+ // deleteAll().
+ typedef LLDependencies<LLSingletonBase*> SingletonDeps;
+ SingletonDeps sdeps;
+ list_t& master(get_master());
+ BOOST_FOREACH(LLSingletonBase* sp, master)
+ {
+ // Build the SingletonDeps structure by adding, for each
+ // LLSingletonBase* sp in the master list, sp itself. It has no
+ // associated value type in our SingletonDeps, hence the 0. We don't
+ // record the LLSingletons it must follow; rather, we record the ones
+ // it must precede. Copy its mDepends to a KeyList to express that.
+ sdeps.add(sp, 0,
+ SingletonDeps::KeyList(),
+ SingletonDeps::KeyList(sp->mDepends.begin(), sp->mDepends.end()));
+ }
+ vec_t ret;
+ ret.reserve(master.size());
+ // We should be able to effect this with a transform_iterator that
+ // extracts just the first (key) element from each sorted_iterator, then
+ // uses vec_t's range constructor... but frankly this is more
+ // straightforward, as long as we remember the above reserve() call!
+ BOOST_FOREACH(SingletonDeps::sorted_iterator::value_type pair, sdeps.sort())
+ {
+ ret.push_back(pair.first);
+ }
+ // The master list is not itself pushed onto the master list. Add it as
+ // the very last entry -- it is the LLSingleton on which ALL others
+ // depend! -- so our caller will process it.
+ ret.push_back(MasterList::getInstance());
+ return ret;
+}
+
+//static
+void LLSingletonBase::cleanupAll()
+{
+ // It's essential to traverse these in dependency order.
+ BOOST_FOREACH(LLSingletonBase* sp, dep_sort())
+ {
+ // Call cleanupSingleton() only if we haven't already done so for this
+ // instance.
+ if (! sp->mCleaned)
+ {
+ sp->mCleaned = true;
+
+ logdebugs("calling ",
+ demangle(typeid(*sp).name()).c_str(), "::cleanupSingleton()");
+ try
+ {
+ sp->cleanupSingleton();
+ }
+ catch (const std::exception& e)
+ {
+ logwarns("Exception in ", demangle(typeid(*sp).name()).c_str(),
+ "::cleanupSingleton(): ", e.what());
+ }
+ catch (...)
+ {
+ logwarns("Unknown exception in ", demangle(typeid(*sp).name()).c_str(),
+ "::cleanupSingleton()");
+ }
+ }
+ }
+}
+
+//static
+void LLSingletonBase::deleteAll()
+{
+ // It's essential to traverse these in dependency order.
+ BOOST_FOREACH(LLSingletonBase* sp, dep_sort())
+ {
+ // Capture the class name first: in case of exception, don't count on
+ // being able to extract it later.
+ const std::string name = demangle(typeid(*sp).name());
+ try
+ {
+ // Call static method through instance function pointer.
+ if (! sp->mDeleteSingleton)
+ {
+ // This Should Not Happen... but carry on.
+ logwarns(name.c_str(), "::mDeleteSingleton not initialized!");
+ }
+ else
+ {
+ // properly initialized: call it.
+ logdebugs("calling ", name.c_str(), "::deleteSingleton()");
+ // From this point on, DO NOT DEREFERENCE sp!
+ sp->mDeleteSingleton();
+ }
+ }
+ catch (const std::exception& e)
+ {
+ logwarns("Exception in ", name.c_str(), "::deleteSingleton(): ", e.what());
+ }
+ catch (...)
+ {
+ logwarns("Unknown exception in ", name.c_str(), "::deleteSingleton()");
+ }
+ }
+}
+
+/*------------------------ Final cleanup management ------------------------*/
+class LLSingletonBase::MasterRefcount
+{
+public:
+ // store a POD int so it will be statically initialized to 0
+ int refcount;
+};
+static LLSingletonBase::MasterRefcount sMasterRefcount;
+
+LLSingletonBase::ref_ptr_t LLSingletonBase::get_master_refcount()
+{
+ // Calling this method constructs a new ref_ptr_t, which implicitly calls
+ // intrusive_ptr_add_ref(MasterRefcount*).
+ return &sMasterRefcount;
+}
+
+void intrusive_ptr_add_ref(LLSingletonBase::MasterRefcount* mrc)
+{
+ // Count outstanding SingletonLifetimeManager instances.
+ ++mrc->refcount;
+}
+
+void intrusive_ptr_release(LLSingletonBase::MasterRefcount* mrc)
+{
+ // Notice when each SingletonLifetimeManager instance is destroyed.
+ if (! --mrc->refcount)
+ {
+ // The last instance was destroyed. Time to kill any remaining
+ // LLSingletons -- but in dependency order.
+ LLSingletonBase::deleteAll();
+ }
+}
+
+/*---------------------------- Logging helpers -----------------------------*/
+namespace {
+bool oktolog()
+{
+ // See comments in log() below.
+ return sMasterRefcount.refcount && LLError::is_available();
+}
+
+void log(LLError::ELevel level,
+ const char* p1, const char* p2, const char* p3, const char* p4)
+{
+ // Check whether we're in the implicit final LLSingletonBase::deleteAll()
+ // call. We've carefully arranged for deleteAll() to be called when the
+ // last SingletonLifetimeManager instance is destroyed -- in other words,
+ // when the last translation unit containing an LLSingleton instance
+ // cleans up static data. That could happen after std::cerr is destroyed!
+ // The is_available() test below ensures that we'll stop logging once
+ // LLError has been cleaned up. If we had a similar portable test for
+ // std::cerr, this would be a good place to use it. As we do not, just
+ // don't log anything during implicit final deleteAll(). Detect that by
+ // the master refcount having gone to zero.
+ if (sMasterRefcount.refcount == 0)
+ return;
+
+ // Check LLError::is_available() because some of LLError's infrastructure
+ // is itself an LLSingleton. If that LLSingleton has not yet been
+ // initialized, trying to log will engage LLSingleton machinery... and
+ // around and around we go.
+ if (LLError::is_available())
+ {
+ LL_VLOGS(level, "LLSingleton") << p1 << p2 << p3 << p4 << LL_ENDL;
+ }
+ else
+ {
+ // Caller may be a test program, or something else whose stderr is
+ // visible to the user.
+ std::cerr << p1 << p2 << p3 << p4 << std::endl;
+ }
+}
+
+void logdebugs(const char* p1, const char* p2, const char* p3, const char* p4)
+{
+ log(LLError::LEVEL_DEBUG, p1, p2, p3, p4);
+}
+} // anonymous namespace
+
+//static
+void LLSingletonBase::logwarns(const char* p1, const char* p2, const char* p3, const char* p4)
+{
+ log(LLError::LEVEL_WARN, p1, p2, p3, p4);
+}
+
+//static
+void LLSingletonBase::logerrs(const char* p1, const char* p2, const char* p3, const char* p4)
+{
+ log(LLError::LEVEL_ERROR, p1, p2, p3, p4);
+ // The other important side effect of LL_ERRS() is
+ // https://www.youtube.com/watch?v=OMG7paGJqhQ (emphasis on OMG)
+ LLError::crashAndLoop(std::string());
+}
+std::string LLSingletonBase::demangle(const char* mangled)
+{
+ return LLError::Log::demangle(mangled);
+}
diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h
index 6e6291a165..1b915dfd6e 100644
--- a/indra/llcommon/llsingleton.h
+++ b/indra/llcommon/llsingleton.h
@@ -25,188 +25,495 @@
#ifndef LLSINGLETON_H
#define LLSINGLETON_H
-#include "llerror.h" // *TODO: eliminate this
-
-#include <typeinfo>
#include <boost/noncopyable.hpp>
+#include <boost/unordered_set.hpp>
+#include <boost/intrusive_ptr.hpp>
+#include <list>
+#include <vector>
+#include <typeinfo>
+
+class LLSingletonBase: private boost::noncopyable
+{
+public:
+ class MasterList;
+ class MasterRefcount;
+ typedef boost::intrusive_ptr<MasterRefcount> ref_ptr_t;
+
+private:
+ // All existing LLSingleton instances are tracked in this master list.
+ typedef std::list<LLSingletonBase*> list_t;
+ static list_t& get_master();
+ // This, on the other hand, is a stack whose top indicates the LLSingleton
+ // currently being initialized.
+ static list_t& get_initializing();
+ static list_t& get_initializing_from(MasterList*);
+ // Produce a vector<LLSingletonBase*> of master list, in dependency order.
+ typedef std::vector<LLSingletonBase*> vec_t;
+ static vec_t dep_sort();
+
+ bool mCleaned; // cleanupSingleton() has been called
+ // we directly depend on these other LLSingletons
+ typedef boost::unordered_set<LLSingletonBase*> set_t;
+ set_t mDepends;
+
+protected:
+ typedef enum e_init_state
+ {
+ UNINITIALIZED = 0, // must be default-initialized state
+ CONSTRUCTING,
+ INITIALIZING,
+ INITIALIZED,
+ DELETED
+ } EInitState;
+
+ // Define tag<T> to pass to our template constructor. You can't explicitly
+ // invoke a template constructor with ordinary template syntax:
+ // http://stackoverflow.com/a/3960925/5533635
+ template <typename T>
+ struct tag
+ {
+ typedef T type;
+ };
+
+ // Base-class constructor should only be invoked by the DERIVED_TYPE
+ // constructor, which passes tag<DERIVED_TYPE> for various purposes.
+ template <typename DERIVED_TYPE>
+ LLSingletonBase(tag<DERIVED_TYPE>);
+ virtual ~LLSingletonBase();
+
+ // Every new LLSingleton should be added to/removed from the master list
+ void add_master();
+ void remove_master();
+ // with a little help from our friends.
+ template <class T> friend struct LLSingleton_manage_master;
+
+ // Maintain a stack of the LLSingleton subclass instance currently being
+ // initialized. We use this to notice direct dependencies: we want to know
+ // if A requires B. We deduce a dependency if while initializing A,
+ // control reaches B::getInstance().
+ // We want &A to be at the top of that stack during both A::A() and
+ // A::initSingleton(), since a call to B::getInstance() might occur during
+ // either.
+ // Unfortunately the desired timespan does not correspond neatly with a
+ // single C++ scope, else we'd use RAII to track it. But we do know that
+ // LLSingletonBase's constructor definitely runs just before
+ // LLSingleton's, which runs just before the specific subclass's.
+ void push_initializing(const char*);
+ // LLSingleton is, and must remain, the only caller to initSingleton().
+ // That being the case, we control exactly when it happens -- and we can
+ // pop the stack immediately thereafter.
+ void pop_initializing();
+private:
+ // logging
+ static void log_initializing(const char* verb, const char* name);
+protected:
+ // If a given call to B::getInstance() happens during either A::A() or
+ // A::initSingleton(), record that A directly depends on B.
+ void capture_dependency(list_t& initializing, EInitState);
+
+ // delegate LL_ERRS() logging to llsingleton.cpp
+ static void logerrs(const char* p1, const char* p2="",
+ const char* p3="", const char* p4="");
+ // delegate LL_WARNS() logging to llsingleton.cpp
+ static void logwarns(const char* p1, const char* p2="",
+ const char* p3="", const char* p4="");
+ static std::string demangle(const char* mangled);
+
+ // obtain canonical ref_ptr_t
+ static ref_ptr_t get_master_refcount();
+
+ // Default methods in case subclass doesn't declare them.
+ virtual void initSingleton() {}
+ virtual void cleanupSingleton() {}
+
+ // deleteSingleton() isn't -- and shouldn't be -- a virtual method. It's a
+ // class static. However, given only Foo*, deleteAll() does need to be
+ // able to reach Foo::deleteSingleton(). Make LLSingleton (which declares
+ // deleteSingleton()) store a pointer here. Since we know it's a static
+ // class method, a classic-C function pointer will do.
+ void (*mDeleteSingleton)();
+
+public:
+ /**
+ * Call this to call the cleanupSingleton() method for every LLSingleton
+ * constructed since the start of the last cleanupAll() call. (Any
+ * LLSingleton constructed DURING a cleanupAll() call won't be cleaned up
+ * until the next cleanupAll() call.) cleanupSingleton() neither deletes
+ * nor destroys its LLSingleton; therefore it's safe to include logic that
+ * might take significant realtime or even throw an exception.
+ *
+ * The most important property of cleanupAll() is that cleanupSingleton()
+ * methods are called in dependency order, leaf classes last. Thus, given
+ * two LLSingleton subclasses A and B, if A's dependency on B is properly
+ * expressed as a B::getInstance() or B::instance() call during either
+ * A::A() or A::initSingleton(), B will be cleaned up after A.
+ *
+ * If a cleanupSingleton() method throws an exception, the exception is
+ * logged, but cleanupAll() attempts to continue calling the rest of the
+ * cleanupSingleton() methods.
+ */
+ static void cleanupAll();
+ /**
+ * Call this to call the deleteSingleton() method for every LLSingleton
+ * constructed since the start of the last deleteAll() call. (Any
+ * LLSingleton constructed DURING a deleteAll() call won't be cleaned up
+ * until the next deleteAll() call.) deleteSingleton() deletes and
+ * destroys its LLSingleton. Any cleanup logic that might take significant
+ * realtime -- or throw an exception -- must not be placed in your
+ * LLSingleton's destructor, but rather in its cleanupSingleton() method.
+ *
+ * The most important property of deleteAll() is that deleteSingleton()
+ * methods are called in dependency order, leaf classes last. Thus, given
+ * two LLSingleton subclasses A and B, if A's dependency on B is properly
+ * expressed as a B::getInstance() or B::instance() call during either
+ * A::A() or A::initSingleton(), B will be cleaned up after A.
+ *
+ * If a deleteSingleton() method throws an exception, the exception is
+ * logged, but deleteAll() attempts to continue calling the rest of the
+ * deleteSingleton() methods.
+ */
+ static void deleteAll();
+};
+
+// support ref_ptr_t
+void intrusive_ptr_add_ref(LLSingletonBase::MasterRefcount*);
+void intrusive_ptr_release(LLSingletonBase::MasterRefcount*);
-// LLSingleton implements the getInstance() method part of the Singleton
-// pattern. It can't make the derived class constructors protected, though, so
-// you have to do that yourself.
-//
-// There are two ways to use LLSingleton. The first way is to inherit from it
-// while using the typename that you'd like to be static as the template
-// parameter, like so:
-//
-// class Foo: public LLSingleton<Foo>{};
-//
-// Foo& instance = Foo::instance();
-//
-// The second way is to use the singleton class directly, without inheritance:
-//
-// typedef LLSingleton<Foo> FooSingleton;
-//
-// Foo& instance = FooSingleton::instance();
-//
-// In this case, the class being managed as a singleton needs to provide an
-// initSingleton() method since the LLSingleton virtual method won't be
-// available
-//
-// As currently written, it is not thread-safe.
+// Most of the time, we want LLSingleton_manage_master() to forward its
+// methods to real LLSingletonBase methods.
+template <class T>
+struct LLSingleton_manage_master
+{
+ void add(LLSingletonBase* sb) { sb->add_master(); }
+ void remove(LLSingletonBase* sb) { sb->remove_master(); }
+ void push_initializing(LLSingletonBase* sb) { sb->push_initializing(typeid(T).name()); }
+ void pop_initializing (LLSingletonBase* sb) { sb->pop_initializing(); }
+ LLSingletonBase::list_t& get_initializing(T*) { return LLSingletonBase::get_initializing(); }
+};
+// But for the specific case of LLSingletonBase::MasterList, don't.
+template <>
+struct LLSingleton_manage_master<LLSingletonBase::MasterList>
+{
+ void add(LLSingletonBase*) {}
+ void remove(LLSingletonBase*) {}
+ void push_initializing(LLSingletonBase*) {}
+ void pop_initializing (LLSingletonBase*) {}
+ LLSingletonBase::list_t& get_initializing(LLSingletonBase::MasterList* instance)
+ {
+ return LLSingletonBase::get_initializing_from(instance);
+ }
+};
+
+// Now we can implement LLSingletonBase's template constructor.
template <typename DERIVED_TYPE>
-class LLSingleton : private boost::noncopyable
+LLSingletonBase::LLSingletonBase(tag<DERIVED_TYPE>):
+ mCleaned(false),
+ mDeleteSingleton(NULL)
+{
+ // Make this the currently-initializing LLSingleton.
+ LLSingleton_manage_master<DERIVED_TYPE>().push_initializing(this);
+}
+
+/**
+ * LLSingleton implements the getInstance() method part of the Singleton
+ * pattern. It can't make the derived class constructors protected, though, so
+ * you have to do that yourself.
+ *
+ * Derive your class from LLSingleton, passing your subclass name as
+ * LLSingleton's template parameter, like so:
+ *
+ * class Foo: public LLSingleton<Foo>
+ * {
+ * // use this macro at start of every LLSingleton subclass
+ * LLSINGLETON(Foo);
+ * public:
+ * // ...
+ * };
+ *
+ * Foo& instance = Foo::instance();
+ *
+ * LLSingleton recognizes a couple special methods in your derived class.
+ *
+ * If you override LLSingleton<T>::initSingleton(), your method will be called
+ * immediately after the instance is constructed. This is useful for breaking
+ * circular dependencies: if you find that your LLSingleton subclass
+ * constructor references other LLSingleton subclass instances in a chain
+ * leading back to yours, move the instance reference from your constructor to
+ * your initSingleton() method.
+ *
+ * If you override LLSingleton<T>::cleanupSingleton(), your method will be
+ * called if someone calls LLSingletonBase::cleanupAll(). The significant part
+ * of this promise is that cleanupAll() will call individual
+ * cleanupSingleton() methods in reverse dependency order.
+ *
+ * That is, consider LLSingleton subclasses C, B and A. A depends on B, which
+ * in turn depends on C. These dependencies are expressed as calls to
+ * B::instance() or B::getInstance(), and C::instance() or C::getInstance().
+ * It shouldn't matter whether these calls appear in A::A() or
+ * A::initSingleton(), likewise B::B() or B::initSingleton().
+ *
+ * We promise that if you later call LLSingletonBase::cleanupAll():
+ * 1. A::cleanupSingleton() will be called before
+ * 2. B::cleanupSingleton(), which will be called before
+ * 3. C::cleanupSingleton().
+ * Put differently, if your LLSingleton subclass constructor or
+ * initSingleton() method explicitly depends on some other LLSingleton
+ * subclass, you may continue to rely on that other subclass in your
+ * cleanupSingleton() method.
+ *
+ * We introduce a special cleanupSingleton() method because cleanupSingleton()
+ * operations can involve nontrivial realtime, or might throw an exception. A
+ * destructor should do neither!
+ *
+ * If your cleanupSingleton() method throws an exception, we log that
+ * exception but proceed with the remaining cleanupSingleton() calls.
+ *
+ * Similarly, if at some point you call LLSingletonBase::deleteAll(), all
+ * remaining LLSingleton instances will be destroyed in dependency order. (Or
+ * call MySubclass::deleteSingleton() to specifically destroy the canonical
+ * MySubclass instance.)
+ *
+ * As currently written, LLSingleton is not thread-safe.
+ */
+template <typename DERIVED_TYPE>
+class LLSingleton : public LLSingletonBase
{
-
private:
- typedef enum e_init_state
- {
- UNINITIALIZED,
- CONSTRUCTING,
- INITIALIZING,
- INITIALIZED,
- DELETED
- } EInitState;
-
static DERIVED_TYPE* constructSingleton()
{
return new DERIVED_TYPE();
}
-
- // stores pointer to singleton instance
- struct SingletonLifetimeManager
- {
- SingletonLifetimeManager()
- {
- construct();
- }
-
- static void construct()
- {
- sData.mInitState = CONSTRUCTING;
- sData.mInstance = constructSingleton();
- sData.mInitState = INITIALIZING;
- }
-
- ~SingletonLifetimeManager()
- {
- if (sData.mInitState != DELETED)
- {
- deleteSingleton();
- }
- }
- };
-
+
+ // We know of no way to instruct the compiler that every subclass
+ // constructor MUST be private. However, we can make the LLSINGLETON()
+ // macro both declare a private constructor and provide the required
+ // friend declaration. How can we ensure that every subclass uses
+ // LLSINGLETON()? By making that macro provide a definition for this pure
+ // virtual method. If you get "can't instantiate class due to missing pure
+ // virtual method" for this method, then add LLSINGLETON(yourclass) in the
+ // subclass body.
+ virtual void you_must_use_LLSINGLETON_macro() = 0;
+
+ // stores pointer to singleton instance
+ struct SingletonLifetimeManager
+ {
+ SingletonLifetimeManager():
+ mMasterRefcount(LLSingletonBase::get_master_refcount())
+ {
+ construct();
+ }
+
+ static void construct()
+ {
+ sData.mInitState = CONSTRUCTING;
+ sData.mInstance = constructSingleton();
+ sData.mInitState = INITIALIZING;
+ }
+
+ ~SingletonLifetimeManager()
+ {
+ // The dependencies between LLSingletons, and the arbitrary order
+ // of static-object destruction, mean that we DO NOT WANT this
+ // destructor to delete this LLSingleton. This destructor will run
+ // without regard to any other LLSingleton whose cleanup might
+ // depend on its existence. What we really want is to count the
+ // runtime's attempts to cleanup LLSingleton static data -- and on
+ // the very last one, call LLSingletonBase::deleteAll(). That
+ // method will properly honor cross-LLSingleton dependencies. This
+ // is why we store an intrusive_ptr to a MasterRefcount: our
+ // ref_ptr_t member counts SingletonLifetimeManager instances.
+ // Once the runtime destroys the last of these, THEN we can delete
+ // every remaining LLSingleton.
+ }
+
+ LLSingletonBase::ref_ptr_t mMasterRefcount;
+ };
+
+protected:
+ // Pass DERIVED_TYPE explicitly to LLSingletonBase's constructor because,
+ // until our subclass constructor completes, *this isn't yet a
+ // full-fledged DERIVED_TYPE.
+ LLSingleton(): LLSingletonBase(LLSingletonBase::tag<DERIVED_TYPE>())
+ {
+ // populate base-class function pointer with the static
+ // deleteSingleton() function for this particular specialization
+ mDeleteSingleton = &deleteSingleton;
+
+ // add this new instance to the master list
+ LLSingleton_manage_master<DERIVED_TYPE>().add(this);
+ }
+
public:
- virtual ~LLSingleton()
- {
- sData.mInstance = NULL;
- sData.mInitState = DELETED;
- }
-
- /**
- * @brief Immediately delete the singleton.
- *
- * A subsequent call to LLProxy::getInstance() will construct a new
- * instance of the class.
- *
- * LLSingletons are normally destroyed after main() has exited and the C++
- * runtime is cleaning up statically-constructed objects. Some classes
- * derived from LLSingleton have objects that are part of a runtime system
- * that is terminated before main() exits. Calling the destructor of those
- * objects after the termination of their respective systems can cause
- * crashes and other problems during termination of the project. Using this
- * method to destroy the singleton early can prevent these crashes.
- *
- * An example where this is needed is for a LLSingleton that has an APR
- * object as a member that makes APR calls on destruction. The APR system is
- * shut down explicitly before main() exits. This causes a crash on exit.
- * Using this method before the call to apr_terminate() and NOT calling
- * getInstance() again will prevent the crash.
- */
- static void deleteSingleton()
- {
- delete sData.mInstance;
- sData.mInstance = NULL;
- sData.mInitState = DELETED;
- }
-
-
- static DERIVED_TYPE* getInstance()
- {
- static SingletonLifetimeManager sLifeTimeMgr;
-
- switch (sData.mInitState)
- {
- case UNINITIALIZED:
- // should never be uninitialized at this point
- llassert(false);
- return NULL;
- case CONSTRUCTING:
- LL_ERRS() << "Tried to access singleton " << typeid(DERIVED_TYPE).name() << " from singleton constructor!" << LL_ENDL;
- return NULL;
- case INITIALIZING:
- // go ahead and flag ourselves as initialized so we can be reentrant during initialization
- sData.mInitState = INITIALIZED;
- // initialize singleton after constructing it so that it can reference other singletons which in turn depend on it,
- // thus breaking cyclic dependencies
- sData.mInstance->initSingleton();
- return sData.mInstance;
- case INITIALIZED:
- return sData.mInstance;
- case DELETED:
- LL_WARNS() << "Trying to access deleted singleton " << typeid(DERIVED_TYPE).name() << " creating new instance" << LL_ENDL;
- SingletonLifetimeManager::construct();
- // same as first time construction
- sData.mInitState = INITIALIZED;
- sData.mInstance->initSingleton();
- return sData.mInstance;
- }
-
- return NULL;
- }
-
- static DERIVED_TYPE* getIfExists()
- {
- return sData.mInstance;
- }
-
- // Reference version of getInstance()
- // Preferred over getInstance() as it disallows checking for NULL
- static DERIVED_TYPE& instance()
- {
- return *getInstance();
- }
-
- // Has this singleton been created uet?
- // Use this to avoid accessing singletons before the can safely be constructed
- static bool instanceExists()
- {
- return sData.mInitState == INITIALIZED;
- }
-
- // Has this singleton already been deleted?
- // Use this to avoid accessing singletons from a static object's destructor
- static bool destroyed()
- {
- return sData.mInitState == DELETED;
- }
+ virtual ~LLSingleton()
+ {
+ // remove this instance from the master list
+ LLSingleton_manage_master<DERIVED_TYPE>().remove(this);
+ sData.mInstance = NULL;
+ sData.mInitState = DELETED;
+ }
-private:
+ /**
+ * @brief Immediately delete the singleton.
+ *
+ * A subsequent call to LLProxy::getInstance() will construct a new
+ * instance of the class.
+ *
+ * Without an explicit call to LLSingletonBase::deleteAll(), LLSingletons
+ * are implicitly destroyed after main() has exited and the C++ runtime is
+ * cleaning up statically-constructed objects. Some classes derived from
+ * LLSingleton have objects that are part of a runtime system that is
+ * terminated before main() exits. Calling the destructor of those objects
+ * after the termination of their respective systems can cause crashes and
+ * other problems during termination of the project. Using this method to
+ * destroy the singleton early can prevent these crashes.
+ *
+ * An example where this is needed is for a LLSingleton that has an APR
+ * object as a member that makes APR calls on destruction. The APR system is
+ * shut down explicitly before main() exits. This causes a crash on exit.
+ * Using this method before the call to apr_terminate() and NOT calling
+ * getInstance() again will prevent the crash.
+ */
+ static void deleteSingleton()
+ {
+ delete sData.mInstance;
+ sData.mInstance = NULL;
+ sData.mInitState = DELETED;
+ }
+
+ static DERIVED_TYPE* getInstance()
+ {
+ static SingletonLifetimeManager sLifeTimeMgr;
- virtual void initSingleton() {}
+ switch (sData.mInitState)
+ {
+ case UNINITIALIZED:
+ // should never be uninitialized at this point
+ logerrs("Uninitialized singleton ",
+ demangle(typeid(DERIVED_TYPE).name()).c_str());
+ return NULL;
- struct SingletonData
- {
- // explicitly has a default constructor so that member variables are zero initialized in BSS
- // and only changed by singleton logic, not constructor running during startup
- EInitState mInitState;
- DERIVED_TYPE* mInstance;
- };
- static SingletonData sData;
+ case CONSTRUCTING:
+ logerrs("Tried to access singleton ",
+ demangle(typeid(DERIVED_TYPE).name()).c_str(),
+ " from singleton constructor!");
+ return NULL;
+
+ case INITIALIZING:
+ // go ahead and flag ourselves as initialized so we can be
+ // reentrant during initialization
+ sData.mInitState = INITIALIZED;
+ // initialize singleton after constructing it so that it can
+ // reference other singletons which in turn depend on it, thus
+ // breaking cyclic dependencies
+ sData.mInstance->initSingleton();
+ // pop this off stack of initializing singletons
+ LLSingleton_manage_master<DERIVED_TYPE>().pop_initializing(sData.mInstance);
+ break;
+
+ case INITIALIZED:
+ break;
+
+ case DELETED:
+ logwarns("Trying to access deleted singleton ",
+ demangle(typeid(DERIVED_TYPE).name()).c_str(),
+ " -- creating new instance");
+ SingletonLifetimeManager::construct();
+ // same as first time construction
+ sData.mInitState = INITIALIZED;
+ sData.mInstance->initSingleton();
+ // pop this off stack of initializing singletons
+ LLSingleton_manage_master<DERIVED_TYPE>().pop_initializing(sData.mInstance);
+ break;
+ }
+
+ // By this point, if DERIVED_TYPE was pushed onto the initializing
+ // stack, it has been popped off. So the top of that stack, if any, is
+ // an LLSingleton that directly depends on DERIVED_TYPE. If this call
+ // came from another LLSingleton, rather than from vanilla application
+ // code, record the dependency.
+ sData.mInstance->capture_dependency(
+ LLSingleton_manage_master<DERIVED_TYPE>().get_initializing(sData.mInstance),
+ sData.mInitState);
+ return sData.mInstance;
+ }
+
+ // Reference version of getInstance()
+ // Preferred over getInstance() as it disallows checking for NULL
+ static DERIVED_TYPE& instance()
+ {
+ return *getInstance();
+ }
+
+ // Has this singleton been created yet?
+ // Use this to avoid accessing singletons before they can safely be constructed.
+ static bool instanceExists()
+ {
+ return sData.mInitState == INITIALIZED;
+ }
+
+private:
+ struct SingletonData
+ {
+ // explicitly has a default constructor so that member variables are zero initialized in BSS
+ // and only changed by singleton logic, not constructor running during startup
+ EInitState mInitState;
+ DERIVED_TYPE* mInstance;
+ };
+ static SingletonData sData;
};
template<typename T>
typename LLSingleton<T>::SingletonData LLSingleton<T>::sData;
+/**
+ * Use LLSINGLETON(Foo); at the start of an LLSingleton<Foo> subclass body
+ * when you want to declare an out-of-line constructor:
+ *
+ * @code
+ * class Foo: public LLSingleton<Foo>
+ * {
+ * // use this macro at start of every LLSingleton subclass
+ * LLSINGLETON(Foo);
+ * public:
+ * // ...
+ * };
+ * // ...
+ * [inline]
+ * Foo::Foo() { ... }
+ * @endcode
+ *
+ * Unfortunately, this mechanism does not permit you to define even a simple
+ * (but nontrivial) constructor within the class body. If it's literally
+ * trivial, use LLSINGLETON_EMPTY_CTOR(); if not, use LLSINGLETON() and define
+ * the constructor outside the class body. If you must define it in a header
+ * file, use 'inline' (unless it's a template class) to avoid duplicate-symbol
+ * errors at link time.
+ */
+#define LLSINGLETON(DERIVED_CLASS) \
+private: \
+ /* implement LLSingleton pure virtual method whose sole purpose */ \
+ /* is to remind people to use this macro */ \
+ virtual void you_must_use_LLSINGLETON_macro() {} \
+ friend class LLSingleton<DERIVED_CLASS>; \
+ DERIVED_CLASS()
+
+/**
+ * Use LLSINGLETON_EMPTY_CTOR(Foo); at the start of an LLSingleton<Foo>
+ * subclass body when the constructor is trivial:
+ *
+ * @code
+ * class Foo: public LLSingleton<Foo>
+ * {
+ * // use this macro at start of every LLSingleton subclass
+ * LLSINGLETON_EMPTY_CTOR(Foo);
+ * public:
+ * // ...
+ * };
+ * @endcode
+ */
+#define LLSINGLETON_EMPTY_CTOR(DERIVED_CLASS) \
+ /* LLSINGLETON() is carefully implemented to permit exactly this */ \
+ LLSINGLETON(DERIVED_CLASS) {}
+
#endif
diff --git a/indra/llcommon/tests/llheteromap_test.cpp b/indra/llcommon/tests/llheteromap_test.cpp
new file mode 100644
index 0000000000..686bffb878
--- /dev/null
+++ b/indra/llcommon/tests/llheteromap_test.cpp
@@ -0,0 +1,163 @@
+/**
+ * @file llheteromap_test.cpp
+ * @author Nat Goodspeed
+ * @date 2016-10-12
+ * @brief Test for llheteromap.
+ *
+ * $LicenseInfo:firstyear=2016&license=viewerlgpl$
+ * Copyright (c) 2016, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llheteromap.h"
+// STL headers
+#include <set>
+// std headers
+// external library headers
+
+// (pacify clang)
+std::ostream& operator<<(std::ostream& out, const std::set<std::string>& strset);
+// other Linden headers
+#include "../test/lltut.h"
+
+static std::string clog;
+static std::set<std::string> dlog;
+
+// want to be able to use ensure_equals() on a set<string>
+std::ostream& operator<<(std::ostream& out, const std::set<std::string>& strset)
+{
+ out << '{';
+ const char* delim = "";
+ for (std::set<std::string>::const_iterator si(strset.begin()), se(strset.end());
+ si != se; ++si)
+ {
+ out << delim << '"' << *si << '"';
+ delim = ", ";
+ }
+ out << '}';
+ return out;
+}
+
+// unrelated test classes
+struct Chalk
+{
+ int dummy;
+ std::string name;
+
+ Chalk():
+ dummy(0)
+ {
+ clog.append("a");
+ }
+
+ ~Chalk()
+ {
+ dlog.insert("a");
+ }
+
+private:
+ Chalk(const Chalk&); // no implementation
+};
+
+struct Cheese
+{
+ std::string name;
+
+ Cheese()
+ {
+ clog.append("e");
+ }
+
+ ~Cheese()
+ {
+ dlog.insert("e");
+ }
+
+private:
+ Cheese(const Cheese&); // no implementation
+};
+
+struct Chowdah
+{
+ char displace[17];
+ std::string name;
+
+ Chowdah()
+ {
+ displace[0] = '\0';
+ clog.append("o");
+ }
+
+ ~Chowdah()
+ {
+ dlog.insert("o");
+ }
+
+private:
+ Chowdah(const Chowdah&); // no implementation
+};
+
+/*****************************************************************************
+* TUT
+*****************************************************************************/
+namespace tut
+{
+ struct llheteromap_data
+ {
+ llheteromap_data()
+ {
+ clog.erase();
+ dlog.clear();
+ }
+ };
+ typedef test_group<llheteromap_data> llheteromap_group;
+ typedef llheteromap_group::object object;
+ llheteromap_group llheteromapgrp("llheteromap");
+
+ template<> template<>
+ void object::test<1>()
+ {
+ set_test_name("create, get, delete");
+
+ {
+ LLHeteroMap map;
+
+ {
+ // create each instance
+ Chalk& chalk = map.obtain<Chalk>();
+ chalk.name = "Chalk";
+
+ Cheese& cheese = map.obtain<Cheese>();
+ cheese.name = "Cheese";
+
+ Chowdah& chowdah = map.obtain<Chowdah>();
+ chowdah.name = "Chowdah";
+ } // refs go out of scope
+
+ {
+ // verify each instance
+ Chalk& chalk = map.obtain<Chalk>();
+ ensure_equals(chalk.name, "Chalk");
+
+ Cheese& cheese = map.obtain<Cheese>();
+ ensure_equals(cheese.name, "Cheese");
+
+ Chowdah& chowdah = map.obtain<Chowdah>();
+ ensure_equals(chowdah.name, "Chowdah");
+ }
+ } // destroy map
+
+ // Chalk, Cheese and Chowdah should have been created in specific order
+ ensure_equals(clog, "aeo");
+
+ // We don't care what order they're destroyed in, as long as each is
+ // appropriately destroyed.
+ std::set<std::string> dtorset;
+ for (const char* cp = "aeo"; *cp; ++cp)
+ dtorset.insert(std::string(1, *cp));
+ ensure_equals(dlog, dtorset);
+ }
+} // namespace tut
diff --git a/indra/llcommon/tests/llpounceable_test.cpp b/indra/llcommon/tests/llpounceable_test.cpp
new file mode 100644
index 0000000000..2f4915ce11
--- /dev/null
+++ b/indra/llcommon/tests/llpounceable_test.cpp
@@ -0,0 +1,230 @@
+/**
+ * @file llpounceable_test.cpp
+ * @author Nat Goodspeed
+ * @date 2015-05-22
+ * @brief Test for llpounceable.
+ *
+ * $LicenseInfo:firstyear=2015&license=viewerlgpl$
+ * Copyright (c) 2015, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llpounceable.h"
+// STL headers
+// std headers
+// external library headers
+#include <boost/bind.hpp>
+// other Linden headers
+#include "../test/lltut.h"
+
+/*----------------------------- string testing -----------------------------*/
+void append(std::string* dest, const std::string& src)
+{
+ dest->append(src);
+}
+
+/*-------------------------- Data-struct testing ---------------------------*/
+struct Data
+{
+ Data(const std::string& data):
+ mData(data)
+ {}
+ const std::string mData;
+};
+
+void setter(Data** dest, Data* ptr)
+{
+ *dest = ptr;
+}
+
+static Data* static_check = 0;
+
+// Set up an extern pointer to an LLPounceableStatic so the linker will fill
+// in the forward reference from below, before runtime.
+extern LLPounceable<Data*, LLPounceableStatic> gForward;
+
+struct EnqueueCall
+{
+ EnqueueCall()
+ {
+ // Intentionally use a forward reference to an LLPounceableStatic that
+ // we believe is NOT YET CONSTRUCTED. This models the scenario in
+ // which a constructor in another translation unit runs before
+ // constructors in this one. We very specifically want callWhenReady()
+ // to work even in that case: we need the LLPounceableQueueImpl to be
+ // initialized even if the LLPounceable itself is not.
+ gForward.callWhenReady(boost::bind(setter, &static_check, _1));
+ }
+} nqcall;
+// When this declaration is processed, we should enqueue the
+// setter(&static_check, _1) call for when gForward is set non-NULL. Needless
+// to remark, we want this call not to crash.
+
+// Now declare gForward. Its constructor should not run until after nqcall's.
+LLPounceable<Data*, LLPounceableStatic> gForward;
+
+/*****************************************************************************
+* TUT
+*****************************************************************************/
+namespace tut
+{
+ struct llpounceable_data
+ {
+ };
+ typedef test_group<llpounceable_data> llpounceable_group;
+ typedef llpounceable_group::object object;
+ llpounceable_group llpounceablegrp("llpounceable");
+
+ template<> template<>
+ void object::test<1>()
+ {
+ set_test_name("LLPounceableStatic out-of-order test");
+ // LLPounceable<T, LLPounceableStatic>::callWhenReady() must work even
+ // before LLPounceable's constructor runs. That's the whole point of
+ // implementing it with an LLSingleton queue. This models (say)
+ // LLPounceableStatic<LLMessageSystem*, LLPounceableStatic>.
+ ensure("static_check should still be null", ! static_check);
+ Data myData("test<1>");
+ gForward = &myData; // should run setter
+ ensure_equals("static_check should be &myData", static_check, &myData);
+ }
+
+ template<> template<>
+ void object::test<2>()
+ {
+ set_test_name("LLPounceableQueue different queues");
+ // We expect that LLPounceable<T, LLPounceableQueue> should have
+ // different queues because that specialization stores the queue
+ // directly in the LLPounceable instance.
+ Data *aptr = 0, *bptr = 0;
+ LLPounceable<Data*> a, b;
+ a.callWhenReady(boost::bind(setter, &aptr, _1));
+ b.callWhenReady(boost::bind(setter, &bptr, _1));
+ ensure("aptr should be null", ! aptr);
+ ensure("bptr should be null", ! bptr);
+ Data adata("a"), bdata("b");
+ a = &adata;
+ ensure_equals("aptr should be &adata", aptr, &adata);
+ // but we haven't yet set b
+ ensure("bptr should still be null", !bptr);
+ b = &bdata;
+ ensure_equals("bptr should be &bdata", bptr, &bdata);
+ }
+
+ template<> template<>
+ void object::test<3>()
+ {
+ set_test_name("LLPounceableStatic different queues");
+ // LLPounceable<T, LLPounceableStatic> should also have a distinct
+ // queue for each instance, but that engages an additional map lookup
+ // because there's only one LLSingleton for each T.
+ Data *aptr = 0, *bptr = 0;
+ LLPounceable<Data*, LLPounceableStatic> a, b;
+ a.callWhenReady(boost::bind(setter, &aptr, _1));
+ b.callWhenReady(boost::bind(setter, &bptr, _1));
+ ensure("aptr should be null", ! aptr);
+ ensure("bptr should be null", ! bptr);
+ Data adata("a"), bdata("b");
+ a = &adata;
+ ensure_equals("aptr should be &adata", aptr, &adata);
+ // but we haven't yet set b
+ ensure("bptr should still be null", !bptr);
+ b = &bdata;
+ ensure_equals("bptr should be &bdata", bptr, &bdata);
+ }
+
+ template<> template<>
+ void object::test<4>()
+ {
+ set_test_name("LLPounceable<T> looks like T");
+ // We want LLPounceable<T, TAG> to be drop-in replaceable for a plain
+ // T for read constructs. In particular, it should behave like a dumb
+ // pointer -- and with zero abstraction cost for such usage.
+ Data* aptr = 0;
+ Data a("a");
+ // should be able to initialize a pounceable (when its constructor
+ // runs)
+ LLPounceable<Data*> pounceable(&a);
+ // should be able to pass LLPounceable<T> to function accepting T
+ setter(&aptr, pounceable);
+ ensure_equals("aptr should be &a", aptr, &a);
+ // should be able to dereference with *
+ ensure_equals("deref with *", (*pounceable).mData, "a");
+ // should be able to dereference with ->
+ ensure_equals("deref with ->", pounceable->mData, "a");
+ // bool operations
+ ensure("test with operator bool()", pounceable);
+ ensure("test with operator !()", ! (! pounceable));
+ }
+
+ template<> template<>
+ void object::test<5>()
+ {
+ set_test_name("Multiple callWhenReady() queue items");
+ Data *p1 = 0, *p2 = 0, *p3 = 0;
+ Data a("a");
+ LLPounceable<Data*> pounceable;
+ // queue up a couple setter() calls for later
+ pounceable.callWhenReady(boost::bind(setter, &p1, _1));
+ pounceable.callWhenReady(boost::bind(setter, &p2, _1));
+ // should still be pending
+ ensure("p1 should be null", !p1);
+ ensure("p2 should be null", !p2);
+ ensure("p3 should be null", !p3);
+ pounceable = 0;
+ // assigning a new empty value shouldn't flush the queue
+ ensure("p1 should still be null", !p1);
+ ensure("p2 should still be null", !p2);
+ ensure("p3 should still be null", !p3);
+ // using whichever syntax
+ pounceable.reset(0);
+ // try to make ensure messages distinct... tough to pin down which
+ // ensure() failed if multiple ensure() calls in the same test<n> have
+ // the same message!
+ ensure("p1 should again be null", !p1);
+ ensure("p2 should again be null", !p2);
+ ensure("p3 should again be null", !p3);
+ pounceable.reset(&a); // should flush queue
+ ensure_equals("p1 should be &a", p1, &a);
+ ensure_equals("p2 should be &a", p2, &a);
+ ensure("p3 still not set", !p3);
+ // immediate call
+ pounceable.callWhenReady(boost::bind(setter, &p3, _1));
+ ensure_equals("p3 should be &a", p3, &a);
+ }
+
+ template<> template<>
+ void object::test<6>()
+ {
+ set_test_name("queue order");
+ std::string data;
+ LLPounceable<std::string*> pounceable;
+ pounceable.callWhenReady(boost::bind(append, _1, "a"));
+ pounceable.callWhenReady(boost::bind(append, _1, "b"));
+ pounceable.callWhenReady(boost::bind(append, _1, "c"));
+ pounceable = &data;
+ ensure_equals("callWhenReady() must preserve chronological order",
+ data, "abc");
+
+ std::string data2;
+ pounceable = NULL;
+ pounceable.callWhenReady(boost::bind(append, _1, "d"));
+ pounceable.callWhenReady(boost::bind(append, _1, "e"));
+ pounceable.callWhenReady(boost::bind(append, _1, "f"));
+ pounceable = &data2;
+ ensure_equals("LLPounceable must reset queue when fired",
+ data2, "def");
+ }
+
+ template<> template<>
+ void object::test<7>()
+ {
+ set_test_name("compile-fail test, uncomment to check");
+ // The following declaration should fail: only LLPounceableQueue and
+ // LLPounceableStatic should work as tags.
+// LLPounceable<Data*, int> pounceable;
+ }
+} // namespace tut
diff --git a/indra/llcommon/tests/llsingleton_test.cpp b/indra/llcommon/tests/llsingleton_test.cpp
index 385289aefe..56886bc73f 100644
--- a/indra/llcommon/tests/llsingleton_test.cpp
+++ b/indra/llcommon/tests/llsingleton_test.cpp
@@ -30,47 +30,172 @@
#include "llsingleton.h"
#include "../test/lltut.h"
+
+// Capture execution sequence by appending to log string.
+std::string sLog;
+
+#define DECLARE_CLASS(CLS) \
+struct CLS: public LLSingleton<CLS> \
+{ \
+ LLSINGLETON(CLS); \
+ ~CLS(); \
+public: \
+ static enum dep_flag { \
+ DEP_NONE, /* no dependency */ \
+ DEP_CTOR, /* dependency in ctor */ \
+ DEP_INIT /* dependency in initSingleton */ \
+ } sDepFlag; \
+ \
+ void initSingleton(); \
+ void cleanupSingleton(); \
+}; \
+ \
+CLS::dep_flag CLS::sDepFlag = DEP_NONE
+
+DECLARE_CLASS(A);
+DECLARE_CLASS(B);
+
+#define DEFINE_MEMBERS(CLS, OTHER) \
+CLS::CLS() \
+{ \
+ sLog.append(#CLS); \
+ if (sDepFlag == DEP_CTOR) \
+ { \
+ (void)OTHER::instance(); \
+ } \
+} \
+ \
+void CLS::initSingleton() \
+{ \
+ sLog.append("i" #CLS); \
+ if (sDepFlag == DEP_INIT) \
+ { \
+ (void)OTHER::instance(); \
+ } \
+} \
+ \
+void CLS::cleanupSingleton() \
+{ \
+ sLog.append("x" #CLS); \
+} \
+ \
+CLS::~CLS() \
+{ \
+ sLog.append("~" #CLS); \
+}
+
+DEFINE_MEMBERS(A, B)
+DEFINE_MEMBERS(B, A)
+
namespace tut
{
- struct singleton
- {
- // We need a class created with the LLSingleton template to test with.
- class LLSingletonTest: public LLSingleton<LLSingletonTest>
- {
-
- };
- };
-
- typedef test_group<singleton> singleton_t;
- typedef singleton_t::object singleton_object_t;
- tut::singleton_t tut_singleton("LLSingleton");
-
- template<> template<>
- void singleton_object_t::test<1>()
- {
-
- }
- template<> template<>
- void singleton_object_t::test<2>()
- {
- LLSingletonTest* singleton_test = LLSingletonTest::getInstance();
- ensure(singleton_test);
- }
- template<> template<>
- void singleton_object_t::test<3>()
- {
- //Construct the instance
- LLSingletonTest::getInstance();
- ensure(LLSingletonTest::instanceExists());
-
- //Delete the instance
- LLSingletonTest::deleteSingleton();
- ensure(LLSingletonTest::destroyed());
- ensure(!LLSingletonTest::instanceExists());
-
- //Construct it again.
- LLSingletonTest* singleton_test = LLSingletonTest::getInstance();
- ensure(singleton_test);
- ensure(LLSingletonTest::instanceExists());
- }
+ struct singleton
+ {
+ // We need a class created with the LLSingleton template to test with.
+ class LLSingletonTest: public LLSingleton<LLSingletonTest>
+ {
+ LLSINGLETON_EMPTY_CTOR(LLSingletonTest);
+ };
+ };
+
+ typedef test_group<singleton> singleton_t;
+ typedef singleton_t::object singleton_object_t;
+ tut::singleton_t tut_singleton("LLSingleton");
+
+ template<> template<>
+ void singleton_object_t::test<1>()
+ {
+
+ }
+ template<> template<>
+ void singleton_object_t::test<2>()
+ {
+ LLSingletonTest* singleton_test = LLSingletonTest::getInstance();
+ ensure(singleton_test);
+ }
+
+ template<> template<>
+ void singleton_object_t::test<3>()
+ {
+ //Construct the instance
+ LLSingletonTest::getInstance();
+ ensure(LLSingletonTest::instanceExists());
+
+ //Delete the instance
+ LLSingletonTest::deleteSingleton();
+ ensure(!LLSingletonTest::instanceExists());
+
+ //Construct it again.
+ LLSingletonTest* singleton_test = LLSingletonTest::getInstance();
+ ensure(singleton_test);
+ ensure(LLSingletonTest::instanceExists());
+ }
+
+#define TESTS(CLS, OTHER, N0, N1, N2, N3) \
+ template<> template<> \
+ void singleton_object_t::test<N0>() \
+ { \
+ set_test_name("just " #CLS); \
+ CLS::sDepFlag = CLS::DEP_NONE; \
+ OTHER::sDepFlag = OTHER::DEP_NONE; \
+ sLog.clear(); \
+ \
+ (void)CLS::instance(); \
+ ensure_equals(sLog, #CLS "i" #CLS); \
+ LLSingletonBase::cleanupAll(); \
+ ensure_equals(sLog, #CLS "i" #CLS "x" #CLS); \
+ LLSingletonBase::deleteAll(); \
+ ensure_equals(sLog, #CLS "i" #CLS "x" #CLS "~" #CLS); \
+ } \
+ \
+ template<> template<> \
+ void singleton_object_t::test<N1>() \
+ { \
+ set_test_name(#CLS " ctor depends " #OTHER); \
+ CLS::sDepFlag = CLS::DEP_CTOR; \
+ OTHER::sDepFlag = OTHER::DEP_NONE; \
+ sLog.clear(); \
+ \
+ (void)CLS::instance(); \
+ ensure_equals(sLog, #CLS #OTHER "i" #OTHER "i" #CLS); \
+ LLSingletonBase::cleanupAll(); \
+ ensure_equals(sLog, #CLS #OTHER "i" #OTHER "i" #CLS "x" #CLS "x" #OTHER); \
+ LLSingletonBase::deleteAll(); \
+ ensure_equals(sLog, #CLS #OTHER "i" #OTHER "i" #CLS "x" #CLS "x" #OTHER "~" #CLS "~" #OTHER); \
+ } \
+ \
+ template<> template<> \
+ void singleton_object_t::test<N2>() \
+ { \
+ set_test_name(#CLS " init depends " #OTHER); \
+ CLS::sDepFlag = CLS::DEP_INIT; \
+ OTHER::sDepFlag = OTHER::DEP_NONE; \
+ sLog.clear(); \
+ \
+ (void)CLS::instance(); \
+ ensure_equals(sLog, #CLS "i" #CLS #OTHER "i" #OTHER); \
+ LLSingletonBase::cleanupAll(); \
+ ensure_equals(sLog, #CLS "i" #CLS #OTHER "i" #OTHER "x" #CLS "x" #OTHER); \
+ LLSingletonBase::deleteAll(); \
+ ensure_equals(sLog, #CLS "i" #CLS #OTHER "i" #OTHER "x" #CLS "x" #OTHER "~" #CLS "~" #OTHER); \
+ } \
+ \
+ template<> template<> \
+ void singleton_object_t::test<N3>() \
+ { \
+ set_test_name(#CLS " circular init"); \
+ CLS::sDepFlag = CLS::DEP_INIT; \
+ OTHER::sDepFlag = OTHER::DEP_CTOR; \
+ sLog.clear(); \
+ \
+ (void)CLS::instance(); \
+ ensure_equals(sLog, #CLS "i" #CLS #OTHER "i" #OTHER); \
+ LLSingletonBase::cleanupAll(); \
+ ensure_equals(sLog, #CLS "i" #CLS #OTHER "i" #OTHER "x" #CLS "x" #OTHER); \
+ LLSingletonBase::deleteAll(); \
+ ensure_equals(sLog, #CLS "i" #CLS #OTHER "i" #OTHER "x" #CLS "x" #OTHER "~" #CLS "~" #OTHER); \
+ }
+
+ TESTS(A, B, 4, 5, 6, 7)
+ TESTS(B, A, 8, 9, 10, 11)
}
diff --git a/indra/llcorehttp/CMakeLists.txt b/indra/llcorehttp/CMakeLists.txt
index 0bb0348d26..b03ee6eeda 100644
--- a/indra/llcorehttp/CMakeLists.txt
+++ b/indra/llcorehttp/CMakeLists.txt
@@ -93,6 +93,7 @@ target_link_libraries(
${OPENSSL_LIBRARIES}
${CRYPTO_LIBRARIES}
${BOOST_THREAD_LIBRARY}
+ ${BOOST_SYSTEM_LIBRARY}
)
# tests
@@ -129,8 +130,8 @@ if (LL_TESTS)
${CURL_LIBRARIES}
${OPENSSL_LIBRARIES}
${CRYPTO_LIBRARIES}
- ${BOOST_SYSTEM_LIBRARY}
${BOOST_THREAD_LIBRARY}
+ ${BOOST_SYSTEM_LIBRARY}
)
# If http_proxy is in the current environment (e.g. to fetch s3-proxy
@@ -197,8 +198,8 @@ endif (DARWIN)
${CURL_LIBRARIES}
${OPENSSL_LIBRARIES}
${CRYPTO_LIBRARIES}
- ${BOOST_SYSTEM_LIBRARY}
${BOOST_THREAD_LIBRARY}
+ ${BOOST_SYSTEM_LIBRARY}
)
add_executable(http_texture_load
diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp
index db57869a1b..07cc0e4625 100644
--- a/indra/llcorehttp/_httpoprequest.cpp
+++ b/indra/llcorehttp/_httpoprequest.cpp
@@ -568,7 +568,17 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service)
// Use the viewer-based thread-safe API which has a
// fast/safe check for proxy enable. Would like to
// encapsulate this someway...
- LLProxy::getInstance()->applyProxySettings(mCurlHandle);
+ if (LLProxy::instanceExists())
+ {
+ // Make sure proxy won't be initialized from here,
+ // it might conflict with LLStartUp::startLLProxy()
+ LLProxy::getInstance()->applyProxySettings(mCurlHandle);
+ }
+ else
+ {
+ LL_WARNS() << "Proxy is not initialized!" << LL_ENDL;
+ }
+
}
else if (gpolicy.mHttpProxy.size())
{
diff --git a/indra/llcorehttp/tests/llcorehttp_test.cpp b/indra/llcorehttp/tests/llcorehttp_test.cpp
index bef762f5ce..a310fc0508 100644..100755
--- a/indra/llcorehttp/tests/llcorehttp_test.cpp
+++ b/indra/llcorehttp/tests/llcorehttp_test.cpp
@@ -46,6 +46,7 @@
#include "test_httprequestqueue.hpp"
#include "llproxy.h"
+#include "llcleanup.h"
unsigned long ssl_thread_id_callback(void);
void ssl_locking_callback(int mode, int type, const char * file, int line);
@@ -101,7 +102,7 @@ void init_curl()
void term_curl()
{
- LLProxy::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLProxy);
CRYPTO_set_locking_callback(NULL);
for (int i(0); i < ssl_mutex_count; ++i)
diff --git a/indra/llcorehttp/tests/test_httprequest.hpp b/indra/llcorehttp/tests/test_httprequest.hpp
index 463e55dd7e..6cd7960ecd 100644
--- a/indra/llcorehttp/tests/test_httprequest.hpp
+++ b/indra/llcorehttp/tests/test_httprequest.hpp
@@ -729,7 +729,7 @@ void HttpRequestTestObjectType::test<7>()
#if 0 // defined(WIN32)
// Can't do this on any platform anymore, the LL logging system holds
// on to memory and produces what looks like memory leaks...
-
+
// printf("Old mem: %d, New mem: %d\n", mMemTotal, GetMemTotal());
ensure("Memory usage back to that at entry", mMemTotal == GetMemTotal());
#endif
@@ -1459,21 +1459,21 @@ void HttpRequestTestObjectType::test<14>()
// references to it after completion of this method.
// Create before memory record as the string copy will bump numbers.
TestHandler2 handler(this, "handler");
- LLCore::HttpHandler::ptr_t handlerp(&handler, NoOpDeletor);
- std::string url_base(get_base_url() + "/sleep/"); // path to a 30-second sleep
-
+ LLCore::HttpHandler::ptr_t handlerp(&handler, NoOpDeletor);
+ std::string url_base(get_base_url() + "/sleep/"); // path to a 30-second sleep
+
// record the total amount of dynamically allocated memory
mMemTotal = GetMemTotal();
mHandlerCalls = 0;
HttpRequest * req = NULL;
HttpOptions::ptr_t opts;
-
+
try
{
- // Get singletons created
+ // Get singletons created
HttpRequest::createService();
-
+
// Start threading early so that thread memory is invariant
// over the test.
HttpRequest::startThread();
@@ -1482,10 +1482,10 @@ void HttpRequestTestObjectType::test<14>()
req = new HttpRequest();
ensure("Memory allocated on construction", mMemTotal < GetMemTotal());
- opts = HttpOptions::ptr_t(new HttpOptions);
- opts->setRetries(0); // Don't retry
+ opts = HttpOptions::ptr_t(new HttpOptions);
+ opts->setRetries(0); // Don't retry
opts->setTimeout(2);
-
+
// Issue a GET that sleeps
mStatus = HttpStatus(HttpStatus::EXT_CURL_EASY, CURLE_OPERATION_TIMEDOUT);
HttpHandle handle = req->requestGetByteRange(HttpRequest::DEFAULT_POLICY_ID,
@@ -1494,8 +1494,8 @@ void HttpRequestTestObjectType::test<14>()
0,
0,
opts,
- HttpHeaders::ptr_t(),
- handlerp);
+ HttpHeaders::ptr_t(),
+ handlerp);
ensure("Valid handle returned for ranged request", handle != LLCORE_HTTP_HANDLE_INVALID);
// Run the notification pump.
@@ -1513,7 +1513,7 @@ void HttpRequestTestObjectType::test<14>()
mStatus = HttpStatus();
handle = req->requestStopThread(handlerp);
ensure("Valid handle returned for second request", handle != LLCORE_HTTP_HANDLE_INVALID);
-
+
// Run the notification pump again
count = 0;
limit = LOOP_COUNT_LONG;
@@ -1535,30 +1535,29 @@ void HttpRequestTestObjectType::test<14>()
ensure("Thread actually stopped running", HttpService::isStopped());
// release options
- opts.reset();
-
+ opts.reset();
+
// release the request object
delete req;
req = NULL;
// Shut down service
HttpRequest::destroyService();
-
+
ensure("Two handler calls on the way out", 2 == mHandlerCalls);
-#if defined(WIN32)
- // Can only do this memory test on Windows. On other platforms,
- // the LL logging system holds on to memory and produces what looks
- // like memory leaks...
-
- // printf("Old mem: %d, New mem: %d\n", mMemTotal, GetMemTotal());
+#if 0 // defined(WIN32)
+ // Can't do this on any platform anymore, the LL logging system holds
+ // on to memory and produces what looks like memory leaks...
+
+ // printf("Old mem: %d, New mem: %d\n", mMemTotal, GetMemTotal());
ensure("Memory usage back to that at entry", mMemTotal == GetMemTotal());
#endif
}
catch (...)
{
stop_thread(req);
- opts.reset();
+ opts.reset();
delete req;
HttpRequest::destroyService();
throw;
@@ -3065,12 +3064,11 @@ void HttpRequestTestObjectType::test<22>()
// Shut down service
HttpRequest::destroyService();
-
-#if defined(WIN32)
- // Can only do this memory test on Windows. On other platforms,
- // the LL logging system holds on to memory and produces what looks
- // like memory leaks...
-
+
+#if 0 // defined(WIN32)
+ // Can't do this on any platform anymore, the LL logging system holds
+ // on to memory and produces what looks like memory leaks...
+
// printf("Old mem: %d, New mem: %d\n", mMemTotal, GetMemTotal());
ensure("Memory usage back to that at entry", mMemTotal == GetMemTotal());
#endif
@@ -3195,12 +3193,11 @@ void HttpRequestTestObjectType::test<23>()
// Shut down service
HttpRequest::destroyService();
-
-#if defined(WIN32)
- // Can only do this memory test on Windows. On other platforms,
- // the LL logging system holds on to memory and produces what looks
- // like memory leaks...
-
+
+#if 0 // defined(WIN32)
+ // Can't do this on any platform anymore, the LL logging system holds
+ // on to memory and produces what looks like memory leaks...
+
// printf("Old mem: %d, New mem: %d\n", mMemTotal, GetMemTotal());
ensure("Memory usage back to that at entry", mMemTotal == GetMemTotal());
#endif
diff --git a/indra/llcorehttp/tests/test_llcorehttp_peer.py b/indra/llcorehttp/tests/test_llcorehttp_peer.py
index 6c5f37d407..493143641b 100755
--- a/indra/llcorehttp/tests/test_llcorehttp_peer.py
+++ b/indra/llcorehttp/tests/test_llcorehttp_peer.py
@@ -34,16 +34,19 @@ import sys
import time
import select
import getopt
-from threading import Thread
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
-from SocketServer import ThreadingMixIn
from llbase.fastest_elementtree import parse as xml_parse
from llbase import llsd
+
+# we're in llcorehttp/tests ; testrunner.py is found in llmessage/tests
+sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir,
+ "llmessage", "tests"))
+
from testrunner import freeport, run, debug, VERBOSE
class TestHTTPRequestHandler(BaseHTTPRequestHandler):
@@ -269,7 +272,7 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler):
# Suppress error output as well
pass
-class Server(ThreadingMixIn, HTTPServer):
+class Server(HTTPServer):
# This pernicious flag is on by default in HTTPServer. But proper
# operation of freeport() absolutely depends on it being off.
allow_reuse_address = False
@@ -293,22 +296,26 @@ if __name__ == "__main__":
if option == "-V" or option == "--valgrind":
do_valgrind = True
- # Instantiate a Server(TestHTTPRequestHandler) on the first free port
- # in the specified port range. Doing this inline is better than in a
- # daemon thread: if it blows up here, we'll get a traceback. If it blew up
- # in some other thread, the traceback would get eaten and we'd run the
- # subject test program anyway.
- httpd, port = freeport(xrange(8000, 8020),
- lambda port: Server(('127.0.0.1', port), TestHTTPRequestHandler))
+ # function to make a server with specified port
+ make_server = lambda port: Server(('127.0.0.1', port), TestHTTPRequestHandler)
+
+ if not sys.platform.startswith("win"):
+ # Instantiate a Server(TestHTTPRequestHandler) on a port chosen by the
+ # runtime.
+ httpd = make_server(0)
+ else:
+ # "Then there's Windows"
+ # Instantiate a Server(TestHTTPRequestHandler) on the first free port
+ # in the specified port range.
+ httpd, port = freeport(xrange(8000, 8020), make_server)
# Pass the selected port number to the subject test program via the
# environment. We don't want to impose requirements on the test program's
# command-line parsing -- and anyway, for C++ integration tests, that's
# performed in TUT code rather than our own.
- os.environ["LL_TEST_PORT"] = str(port)
- debug("$LL_TEST_PORT = %s", port)
+ os.environ["LL_TEST_PORT"] = str(httpd.server_port)
+ debug("$LL_TEST_PORT = %s", httpd.server_port)
if do_valgrind:
args = ["valgrind", "--log-file=./valgrind.log"] + args
path_search = True
- sys.exit(run(server=Thread(name="httpd", target=httpd.serve_forever), use_path=path_search, *args))
-
+ sys.exit(run(server_inst=httpd, use_path=path_search, *args))
diff --git a/indra/llcorehttp/tests/testrunner.py b/indra/llcorehttp/tests/testrunner.py
deleted file mode 100755
index 9a2de71142..0000000000
--- a/indra/llcorehttp/tests/testrunner.py
+++ /dev/null
@@ -1,265 +0,0 @@
-#!/usr/bin/env python
-"""\
-@file testrunner.py
-@author Nat Goodspeed
-@date 2009-03-20
-@brief Utilities for writing wrapper scripts for ADD_COMM_BUILD_TEST unit tests
-
-$LicenseInfo:firstyear=2009&license=viewerlgpl$
-Second Life Viewer Source Code
-Copyright (C) 2010, Linden Research, Inc.
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation;
-version 2.1 of the License only.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-$/LicenseInfo$
-"""
-
-from __future__ import with_statement
-
-import os
-import sys
-import re
-import errno
-import socket
-
-VERBOSE = os.environ.get("INTEGRATION_TEST_VERBOSE", "0") # default to quiet
-# Support usage such as INTEGRATION_TEST_VERBOSE=off -- distressing to user if
-# that construct actually turns on verbosity...
-VERBOSE = not re.match(r"(0|off|false|quiet)$", VERBOSE, re.IGNORECASE)
-
-if VERBOSE:
- def debug(fmt, *args):
- print fmt % args
- sys.stdout.flush()
-else:
- debug = lambda *args: None
-
-def freeport(portlist, expr):
- """
- Find a free server port to use. Specifically, evaluate 'expr' (a
- callable(port)) until it stops raising EADDRINUSE exception.
-
- Pass:
-
- portlist: an iterable (e.g. xrange()) of ports to try. If you exhaust the
- range, freeport() lets the socket.error exception propagate. If you want
- unbounded, you could pass itertools.count(baseport), though of course in
- practice the ceiling is 2^16-1 anyway. But it seems prudent to constrain
- the range much more sharply: if we're iterating an absurd number of times,
- probably something else is wrong.
-
- expr: a callable accepting a port number, specifically one of the items
- from portlist. If calling that callable raises socket.error with
- EADDRINUSE, freeport() retrieves the next item from portlist and retries.
-
- Returns: (expr(port), port)
-
- port: the value from portlist for which expr(port) succeeded
-
- Raises:
-
- Any exception raised by expr(port) other than EADDRINUSE.
-
- socket.error if, for every item from portlist, expr(port) raises
- socket.error. The exception you see is the one from the last item in
- portlist.
-
- StopIteration if portlist is completely empty.
-
- Example:
-
- class Server(HTTPServer):
- # If you use BaseHTTPServer.HTTPServer, turning off this flag is
- # essential for proper operation of freeport()!
- allow_reuse_address = False
- # ...
- server, port = freeport(xrange(8000, 8010),
- lambda port: Server(("localhost", port),
- MyRequestHandler))
- # pass 'port' to client code
- # call server.serve_forever()
- """
- try:
- # If portlist is completely empty, let StopIteration propagate: that's an
- # error because we can't return meaningful values. We have no 'port',
- # therefore no 'expr(port)'.
- portiter = iter(portlist)
- port = portiter.next()
-
- while True:
- try:
- # If this value of port works, return as promised.
- value = expr(port)
-
- except socket.error, err:
- # Anything other than 'Address already in use', propagate
- if err.args[0] != errno.EADDRINUSE:
- raise
-
- # Here we want the next port from portiter. But on StopIteration,
- # we want to raise the original exception rather than
- # StopIteration. So save the original exc_info().
- type, value, tb = sys.exc_info()
- try:
- try:
- port = portiter.next()
- except StopIteration:
- raise type, value, tb
- finally:
- # Clean up local traceback, see docs for sys.exc_info()
- del tb
-
- else:
- debug("freeport() returning %s on port %s", value, port)
- return value, port
-
- # Recap of the control flow above:
- # If expr(port) doesn't raise, return as promised.
- # If expr(port) raises anything but EADDRINUSE, propagate that
- # exception.
- # If portiter.next() raises StopIteration -- that is, if the port
- # value we just passed to expr(port) was the last available -- reraise
- # the EADDRINUSE exception.
- # If we've actually arrived at this point, portiter.next() delivered a
- # new port value. Loop back to pass that to expr(port).
-
- except Exception, err:
- debug("*** freeport() raising %s: %s", err.__class__.__name__, err)
- raise
-
-def run(*args, **kwds):
- """All positional arguments collectively form a command line, executed as
- a synchronous child process.
- In addition, pass server=new_thread_instance as an explicit keyword (to
- differentiate it from an additional command-line argument).
- new_thread_instance should be an instantiated but not yet started Thread
- subclass instance, e.g.:
- run("python", "-c", 'print "Hello, world!"', server=TestHTTPServer(name="httpd"))
- """
- # If there's no server= keyword arg, don't start a server thread: simply
- # run a child process.
- try:
- thread = kwds.pop("server")
- except KeyError:
- pass
- else:
- # Start server thread. Note that this and all other comm server
- # threads should be daemon threads: we'll let them run "forever,"
- # confident that the whole process will terminate when the main thread
- # terminates, which will be when the child process terminates.
- thread.setDaemon(True)
- thread.start()
- # choice of os.spawnv():
- # - [v vs. l] pass a list of args vs. individual arguments,
- # - [no p] don't use the PATH because we specifically want to invoke the
- # executable passed as our first arg,
- # - [no e] child should inherit this process's environment.
- debug("Running %s...", " ".join(args))
- if kwds.get("use_path", False):
- rc = os.spawnvp(os.P_WAIT, args[0], args)
- else:
- rc = os.spawnv(os.P_WAIT, args[0], args)
- debug("%s returned %s", args[0], rc)
- return rc
-
-# ****************************************************************************
-# test code -- manual at this point, see SWAT-564
-# ****************************************************************************
-def test_freeport():
- # ------------------------------- Helpers --------------------------------
- from contextlib import contextmanager
- # helper Context Manager for expecting an exception
- # with exc(SomeError):
- # raise SomeError()
- # raises AssertionError otherwise.
- @contextmanager
- def exc(exception_class, *args):
- try:
- yield
- except exception_class, err:
- for i, expected_arg in enumerate(args):
- assert expected_arg == err.args[i], \
- "Raised %s, but args[%s] is %r instead of %r" % \
- (err.__class__.__name__, i, err.args[i], expected_arg)
- print "Caught expected exception %s(%s)" % \
- (err.__class__.__name__, ', '.join(repr(arg) for arg in err.args))
- else:
- assert False, "Failed to raise " + exception_class.__class__.__name__
-
- # helper to raise specified exception
- def raiser(exception):
- raise exception
-
- # the usual
- def assert_equals(a, b):
- assert a == b, "%r != %r" % (a, b)
-
- # ------------------------ Sanity check the above ------------------------
- class SomeError(Exception): pass
- # Without extra args, accept any err.args value
- with exc(SomeError):
- raiser(SomeError("abc"))
- # With extra args, accept only the specified value
- with exc(SomeError, "abc"):
- raiser(SomeError("abc"))
- with exc(AssertionError):
- with exc(SomeError, "abc"):
- raiser(SomeError("def"))
- with exc(AssertionError):
- with exc(socket.error, errno.EADDRINUSE):
- raiser(socket.error(errno.ECONNREFUSED, 'Connection refused'))
-
- # ----------- freeport() without engaging socket functionality -----------
- # If portlist is empty, freeport() raises StopIteration.
- with exc(StopIteration):
- freeport([], None)
-
- assert_equals(freeport([17], str), ("17", 17))
-
- # This is the magic exception that should prompt us to retry
- inuse = socket.error(errno.EADDRINUSE, 'Address already in use')
- # Get the iterator to our ports list so we can check later if we've used all
- ports = iter(xrange(5))
- with exc(socket.error, errno.EADDRINUSE):
- freeport(ports, lambda port: raiser(inuse))
- # did we entirely exhaust 'ports'?
- with exc(StopIteration):
- ports.next()
-
- ports = iter(xrange(2))
- # Any exception but EADDRINUSE should quit immediately
- with exc(SomeError):
- freeport(ports, lambda port: raiser(SomeError()))
- assert_equals(ports.next(), 1)
-
- # ----------- freeport() with platform-dependent socket stuff ------------
- # This is what we should've had unit tests to begin with (see CHOP-661).
- def newbind(port):
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.bind(('127.0.0.1', port))
- return sock
-
- bound0, port0 = freeport(xrange(7777, 7780), newbind)
- assert_equals(port0, 7777)
- bound1, port1 = freeport(xrange(7777, 7780), newbind)
- assert_equals(port1, 7778)
- bound2, port2 = freeport(xrange(7777, 7780), newbind)
- assert_equals(port2, 7779)
- with exc(socket.error, errno.EADDRINUSE):
- bound3, port3 = freeport(xrange(7777, 7780), newbind)
-
-if __name__ == "__main__":
- test_freeport()
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index dfb344c908..dca49be051 100644
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -45,6 +45,7 @@
#include "llhttpsdhandler.h"
#include "httpcommon.h"
#include "httpresponse.h"
+#include "llcleanup.h"
#include <curl/curl.h>
#include <openssl/crypto.h>
@@ -623,7 +624,7 @@ void LLCrashLogger::commonCleanup()
{
term_curl();
LLError::logToFile(""); //close crashreport.log
- LLProxy::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLProxy);
}
void LLCrashLogger::init_curl()
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index f71607096c..a07ea14621 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -705,18 +705,21 @@ void LLImageBase::deleteData()
// virtual
U8* LLImageBase::allocateData(S32 size)
{
+ //make this function thread-safe.
+ static const U32 MAX_BUFFER_SIZE = 4096 * 4096 * 16; //256 MB
+ mBadBufferAllocation = false;
+
if (size < 0)
{
size = mWidth * mHeight * mComponents;
if (size <= 0)
{
- LL_ERRS() << llformat("LLImageBase::allocateData called with bad dimensions: %dx%dx%d",mWidth,mHeight,(S32)mComponents) << LL_ENDL;
+ LL_WARNS() << llformat("LLImageBase::allocateData called with bad dimensions: %dx%dx%d",mWidth,mHeight,(S32)mComponents) << LL_ENDL;
+ mBadBufferAllocation = true;
}
- }
-
- //make this function thread-safe.
- static const U32 MAX_BUFFER_SIZE = 4096 * 4096 * 16 ; //256 MB
- if (size < 1 || size > MAX_BUFFER_SIZE)
+ }
+
+ if (!mBadBufferAllocation && (size < 1 || size > MAX_BUFFER_SIZE))
{
LL_INFOS() << "width: " << mWidth << " height: " << mHeight << " components: " << mComponents << LL_ENDL ;
if(mAllowOverSize)
@@ -725,25 +728,31 @@ U8* LLImageBase::allocateData(S32 size)
}
else
{
- LL_ERRS() << "LLImageBase::allocateData: bad size: " << size << LL_ENDL;
+ LL_WARNS() << "LLImageBase::allocateData: bad size: " << size << LL_ENDL;
+ mBadBufferAllocation = true;
}
}
- if (!mData || size != mDataSize)
+
+ if (!mBadBufferAllocation && (!mData || size != mDataSize))
{
deleteData(); // virtual
- mBadBufferAllocation = false ;
mData = (U8*)ALLOCATE_MEM(sPrivatePoolp, size);
if (!mData)
{
LL_WARNS() << "Failed to allocate image data size [" << size << "]" << LL_ENDL;
- size = 0 ;
- mWidth = mHeight = 0 ;
- mBadBufferAllocation = true ;
+ mBadBufferAllocation = true;
}
- mDataSize = size;
- claimMem(mDataSize);
}
+ if (mBadBufferAllocation)
+ {
+ size = 0;
+ mWidth = mHeight = 0;
+ mData = NULL;
+ }
+ mDataSize = size;
+ claimMem(mDataSize);
+
return mData;
}
@@ -791,7 +800,7 @@ U8* LLImageBase::getData()
return mData;
}
-bool LLImageBase::isBufferInvalid()
+bool LLImageBase::isBufferInvalid() const
{
return mBadBufferAllocation || mData == NULL ;
}
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index 9cc7431a9c..d0bd4a2aef 100644
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -141,7 +141,7 @@ public:
const U8 *getData() const ;
U8 *getData() ;
- bool isBufferInvalid() ;
+ bool isBufferInvalid() const;
void setSize(S32 width, S32 height, S32 ncomponents);
U8* allocateDataSize(S32 width, S32 height, S32 ncomponents, S32 size = -1); // setSize() + allocateData()
diff --git a/indra/llinventory/lleconomy.cpp b/indra/llinventory/lleconomy.cpp
index e10402196f..2a023d8c24 100644
--- a/indra/llinventory/lleconomy.cpp
+++ b/indra/llinventory/lleconomy.cpp
@@ -31,7 +31,7 @@
#include "v3math.h"
-LLGlobalEconomy::LLGlobalEconomy()
+LLBaseEconomy::LLBaseEconomy()
: mObjectCount( -1 ),
mObjectCapacity( -1 ),
mPriceObjectClaim( -1 ),
@@ -45,15 +45,15 @@ LLGlobalEconomy::LLGlobalEconomy()
mPriceGroupCreate( -1 )
{ }
-LLGlobalEconomy::~LLGlobalEconomy()
+LLBaseEconomy::~LLBaseEconomy()
{ }
-void LLGlobalEconomy::addObserver(LLEconomyObserver* observer)
+void LLBaseEconomy::addObserver(LLEconomyObserver* observer)
{
mObservers.push_back(observer);
}
-void LLGlobalEconomy::removeObserver(LLEconomyObserver* observer)
+void LLBaseEconomy::removeObserver(LLEconomyObserver* observer)
{
std::list<LLEconomyObserver*>::iterator it =
std::find(mObservers.begin(), mObservers.end(), observer);
@@ -63,7 +63,7 @@ void LLGlobalEconomy::removeObserver(LLEconomyObserver* observer)
}
}
-void LLGlobalEconomy::notifyObservers()
+void LLBaseEconomy::notifyObservers()
{
for (std::list<LLEconomyObserver*>::iterator it = mObservers.begin();
it != mObservers.end();
@@ -74,7 +74,7 @@ void LLGlobalEconomy::notifyObservers()
}
// static
-void LLGlobalEconomy::processEconomyData(LLMessageSystem *msg, LLGlobalEconomy* econ_data)
+void LLBaseEconomy::processEconomyData(LLMessageSystem *msg, LLBaseEconomy* econ_data)
{
S32 i;
F32 f;
@@ -117,7 +117,7 @@ void LLGlobalEconomy::processEconomyData(LLMessageSystem *msg, LLGlobalEconomy*
econ_data->notifyObservers();
}
-S32 LLGlobalEconomy::calculateTeleportCost(F32 distance) const
+S32 LLBaseEconomy::calculateTeleportCost(F32 distance) const
{
S32 min_cost = getTeleportMinPrice();
F32 exponent = getTeleportPriceExponent();
@@ -135,13 +135,13 @@ S32 LLGlobalEconomy::calculateTeleportCost(F32 distance) const
return cost;
}
-S32 LLGlobalEconomy::calculateLightRent(const LLVector3& object_size) const
+S32 LLBaseEconomy::calculateLightRent(const LLVector3& object_size) const
{
F32 intensity_mod = llmax(object_size.magVec(), 1.f);
return (S32)(intensity_mod * getPriceRentLight());
}
-void LLGlobalEconomy::print()
+void LLBaseEconomy::print()
{
LL_INFOS() << "Global Economy Settings: " << LL_ENDL;
LL_INFOS() << "Object Capacity: " << mObjectCapacity << LL_ENDL;
@@ -159,8 +159,7 @@ void LLGlobalEconomy::print()
}
LLRegionEconomy::LLRegionEconomy()
-: LLGlobalEconomy(),
- mPriceObjectRent( -1.f ),
+: mPriceObjectRent( -1.f ),
mPriceObjectScaleFactor( -1.f ),
mEnergyEfficiency( -1.f ),
mBasePriceParcelClaimDefault(-1),
@@ -187,7 +186,7 @@ void LLRegionEconomy::processEconomyData(LLMessageSystem *msg, void** user_data)
LLRegionEconomy *this_ptr = (LLRegionEconomy*)user_data;
- LLGlobalEconomy::processEconomyData(msg, this_ptr);
+ LLBaseEconomy::processEconomyData(msg, this_ptr);
msg->getS32Fast(_PREHASH_Info, _PREHASH_PriceParcelClaim, i);
this_ptr->setBasePriceParcelClaimDefault(i);
@@ -252,7 +251,7 @@ S32 LLRegionEconomy::getPriceParcelRent() const
void LLRegionEconomy::print()
{
- this->LLGlobalEconomy::print();
+ this->LLBaseEconomy::print();
LL_INFOS() << "Region Economy Settings: " << LL_ENDL;
LL_INFOS() << "Land (square meters): " << mAreaTotal << LL_ENDL;
diff --git a/indra/llinventory/lleconomy.h b/indra/llinventory/lleconomy.h
index 47fcf688a2..cdfde171c1 100644
--- a/indra/llinventory/lleconomy.h
+++ b/indra/llinventory/lleconomy.h
@@ -42,18 +42,11 @@ public:
virtual void onEconomyDataChange() = 0;
};
-class LLGlobalEconomy
+class LLBaseEconomy
{
public:
- LLGlobalEconomy();
- virtual ~LLGlobalEconomy();
-
- // This class defines its singleton internally as a typedef instead of inheriting from
- // LLSingleton like most others because the LLRegionEconomy sub-class might also
- // become a singleton and this pattern will more easily disambiguate them.
- typedef LLSingleton<LLGlobalEconomy> Singleton;
-
- void initSingleton() { }
+ LLBaseEconomy();
+ virtual ~LLBaseEconomy();
virtual void print();
@@ -61,7 +54,7 @@ public:
void removeObserver(LLEconomyObserver* observer);
void notifyObservers();
- static void processEconomyData(LLMessageSystem *msg, LLGlobalEconomy* econ_data);
+ static void processEconomyData(LLMessageSystem *msg, LLBaseEconomy* econ_data);
S32 calculateTeleportCost(F32 distance) const;
S32 calculateLightRent(const LLVector3& object_size) const;
@@ -108,8 +101,12 @@ private:
std::list<LLEconomyObserver*> mObservers;
};
+class LLGlobalEconomy: public LLSingleton<LLGlobalEconomy>, public LLBaseEconomy
+{
+ LLSINGLETON_EMPTY_CTOR(LLGlobalEconomy);
+};
-class LLRegionEconomy : public LLGlobalEconomy
+class LLRegionEconomy : public LLBaseEconomy
{
public:
LLRegionEconomy();
diff --git a/indra/llinventory/llfoldertype.cpp b/indra/llinventory/llfoldertype.cpp
index 86aca77de8..b0daf639fa 100644
--- a/indra/llinventory/llfoldertype.cpp
+++ b/indra/llinventory/llfoldertype.cpp
@@ -51,8 +51,7 @@ struct FolderEntry : public LLDictionaryEntry
class LLFolderDictionary : public LLSingleton<LLFolderDictionary>,
public LLDictionary<LLFolderType::EType, FolderEntry>
{
-public:
- LLFolderDictionary();
+ LLSINGLETON(LLFolderDictionary);
protected:
virtual LLFolderType::EType notFound() const
{
diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp
index 8807b36117..d1e6807f52 100644
--- a/indra/llinventory/llinventorytype.cpp
+++ b/indra/llinventory/llinventorytype.cpp
@@ -63,8 +63,7 @@ struct InventoryEntry : public LLDictionaryEntry
class LLInventoryDictionary : public LLSingleton<LLInventoryDictionary>,
public LLDictionary<LLInventoryType::EType, InventoryEntry>
{
-public:
- LLInventoryDictionary();
+ LLSINGLETON(LLInventoryDictionary);
};
LLInventoryDictionary::LLInventoryDictionary()
diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h
index 93b9f22b25..692284e04b 100644
--- a/indra/llmath/llmath.h
+++ b/indra/llmath/llmath.h
@@ -254,6 +254,11 @@ inline int round_int(double x)
}
#endif // BOGUS_ROUND
+inline F64 ll_round(const F64 val)
+{
+ return F64(floor(val + 0.5f));
+}
+
inline F32 ll_round( F32 val, F32 nearest )
{
return F32(floor(val * (1.0f / nearest) + 0.5f)) * nearest;
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 6f0b4b2410..7a54d83b3f 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -3697,10 +3697,46 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
continue;
}
- if (face.mTypeMask & (LLVolumeFace::CAP_MASK)) {
+ if (face.mTypeMask & (LLVolumeFace::CAP_MASK))
+ {
+ LLVector4a* v = (LLVector4a*)face.mPositions;
+ LLVector4a* n = (LLVector4a*)face.mNormals;
+
+ for (U32 j = 0; j < face.mNumIndices / 3; j++)
+ {
+ for (S32 k = 0; k < 3; k++)
+ {
+ S32 index = face.mEdge[j * 3 + k];
+
+ if (index == -1)
+ {
+ // silhouette edge, currently only cubes, so no other conditions
+
+ S32 v1 = face.mIndices[j * 3 + k];
+ S32 v2 = face.mIndices[j * 3 + ((k + 1) % 3)];
+
+ LLVector4a t;
+ mat.affineTransform(v[v1], t);
+ vertices.push_back(LLVector3(t[0], t[1], t[2]));
+
+ norm_mat.rotate(n[v1], t);
+
+ t.normalize3fast();
+ normals.push_back(LLVector3(t[0], t[1], t[2]));
+
+ mat.affineTransform(v[v2], t);
+ vertices.push_back(LLVector3(t[0], t[1], t[2]));
+
+ norm_mat.rotate(n[v2], t);
+ t.normalize3fast();
+ normals.push_back(LLVector3(t[0], t[1], t[2]));
+ }
+ }
+ }
}
- else {
+ else
+ {
//==============================================
//DEBUG draw edge map instead of silhouette edge
@@ -5549,10 +5585,17 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
if (!partial_build)
{
resizeIndices(grid_size*grid_size*6);
+ if (!volume->isMeshAssetLoaded())
+ {
+ mEdge.resize(grid_size*grid_size * 6);
+ }
U16* out = mIndices;
S32 idxs[] = {0,1,(grid_size+1)+1,(grid_size+1)+1,(grid_size+1),0};
+
+ int cur_edge = 0;
+
for(S32 gx = 0;gx<grid_size;gx++)
{
@@ -5563,7 +5606,49 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
for(S32 i=5;i>=0;i--)
{
*out++ = ((gy*(grid_size+1))+gx+idxs[i]);
- }
+ }
+
+ S32 edge_value = grid_size * 2 * gy + gx * 2;
+
+ if (gx > 0)
+ {
+ mEdge[cur_edge++] = edge_value;
+ }
+ else
+ {
+ mEdge[cur_edge++] = -1; // Mark face to higlight it
+ }
+
+ if (gy < grid_size - 1)
+ {
+ mEdge[cur_edge++] = edge_value;
+ }
+ else
+ {
+ mEdge[cur_edge++] = -1;
+ }
+
+ mEdge[cur_edge++] = edge_value;
+
+ if (gx < grid_size - 1)
+ {
+ mEdge[cur_edge++] = edge_value;
+ }
+ else
+ {
+ mEdge[cur_edge++] = -1;
+ }
+
+ if (gy > 0)
+ {
+ mEdge[cur_edge++] = edge_value;
+ }
+ else
+ {
+ mEdge[cur_edge++] = -1;
+ }
+
+ mEdge[cur_edge++] = edge_value;
}
else
{
@@ -5571,8 +5656,50 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
{
*out++ = ((gy*(grid_size+1))+gx+idxs[i]);
}
+
+ S32 edge_value = grid_size * 2 * gy + gx * 2;
+
+ if (gy > 0)
+ {
+ mEdge[cur_edge++] = edge_value;
+ }
+ else
+ {
+ mEdge[cur_edge++] = -1;
+ }
+
+ if (gx < grid_size - 1)
+ {
+ mEdge[cur_edge++] = edge_value;
+ }
+ else
+ {
+ mEdge[cur_edge++] = -1;
+ }
+
+ mEdge[cur_edge++] = edge_value;
+
+ if (gy < grid_size - 1)
+ {
+ mEdge[cur_edge++] = edge_value;
+ }
+ else
+ {
+ mEdge[cur_edge++] = -1;
+ }
+
+ if (gx > 0)
+ {
+ mEdge[cur_edge++] = edge_value;
+ }
+ else
+ {
+ mEdge[cur_edge++] = -1;
+ }
+
+ mEdge[cur_edge++] = edge_value;
}
- }
+ }
}
}
diff --git a/indra/llmessage/llavatarname.cpp b/indra/llmessage/llavatarname.cpp
index d2115ee499..2e8886fb51 100644
--- a/indra/llmessage/llavatarname.cpp
+++ b/indra/llmessage/llavatarname.cpp
@@ -166,10 +166,10 @@ void LLAvatarName::setExpires(F64 expires)
mExpires = LLFrameTimer::getTotalSeconds() + expires;
}
-std::string LLAvatarName::getCompleteName(bool use_parentheses) const
+std::string LLAvatarName::getCompleteName(bool use_parentheses, bool force_use_display_name) const
{
std::string name;
- if (sUseDisplayNames)
+ if (sUseDisplayNames || force_use_display_name)
{
if (mUsername.empty() || mIsDisplayNameDefault)
{
@@ -215,9 +215,9 @@ std::string LLAvatarName::getLegacyName() const
return name;
}
-std::string LLAvatarName::getDisplayName() const
+std::string LLAvatarName::getDisplayName(bool force_use_display_name) const
{
- if (sUseDisplayNames)
+ if (sUseDisplayNames || force_use_display_name)
{
return mDisplayName;
}
diff --git a/indra/llmessage/llavatarname.h b/indra/llmessage/llavatarname.h
index 192f43f07c..80b54cded9 100644
--- a/indra/llmessage/llavatarname.h
+++ b/indra/llmessage/llavatarname.h
@@ -65,7 +65,7 @@ public:
// For normal names, returns "James Linden (james.linden)"
// When display names are disabled returns just "James Linden"
- std::string getCompleteName(bool use_parentheses = true) const;
+ std::string getCompleteName(bool use_parentheses = true, bool force_use_display_name = false) const;
// Returns "James Linden" or "bobsmith123 Resident" for backwards
// compatibility with systems like voice and muting
@@ -75,7 +75,7 @@ public:
// "José Sanchez" or "James Linden", UTF-8 encoded Unicode
// Takes the display name preference into account. This is truly the name that should
// be used for all UI where an avatar name has to be used unless we truly want something else (rare)
- std::string getDisplayName() const;
+ std::string getDisplayName(bool force_use_display_name = false) const;
// Returns "James Linden" or "bobsmith123 Resident"
// Used where we explicitely prefer or need a non UTF-8 legacy (ASCII) name
diff --git a/indra/llmessage/llcoproceduremanager.h b/indra/llmessage/llcoproceduremanager.h
index 497367b80c..7d0e83180c 100644
--- a/indra/llmessage/llcoproceduremanager.h
+++ b/indra/llmessage/llcoproceduremanager.h
@@ -37,7 +37,8 @@ class LLCoprocedurePool;
class LLCoprocedureManager : public LLSingleton < LLCoprocedureManager >
{
- friend class LLSingleton < LLCoprocedureManager > ;
+ LLSINGLETON(LLCoprocedureManager);
+ virtual ~LLCoprocedureManager();
public:
typedef boost::function<U32(const std::string &)> SettingQuery_t;
@@ -45,9 +46,6 @@ public:
typedef boost::function<void(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &, const LLUUID &id)> CoProcedure_t;
- LLCoprocedureManager();
- virtual ~LLCoprocedureManager();
-
/// Places the coprocedure on the queue for processing.
///
/// @param name Is used for debugging and should identify this coroutine.
diff --git a/indra/llmessage/llexperiencecache.h b/indra/llmessage/llexperiencecache.h
index 1002b33f80..8ee7080d38 100644
--- a/indra/llmessage/llexperiencecache.h
+++ b/indra/llmessage/llexperiencecache.h
@@ -43,7 +43,7 @@ class LLUUID;
class LLExperienceCache: public LLSingleton < LLExperienceCache >
{
- friend class LLSingleton < LLExperienceCache > ;
+ LLSINGLETON(LLExperienceCache);
public:
typedef boost::function<std::string(const std::string &)> CapabilityQuery_t;
@@ -103,7 +103,6 @@ public:
static const int PROPERTY_SUSPENDED; // 1 << 7
private:
- LLExperienceCache();
virtual ~LLExperienceCache();
virtual void initSingleton();
diff --git a/indra/llmessage/llproxy.h b/indra/llmessage/llproxy.h
index bd23dd39de..688dff7c83 100644
--- a/indra/llmessage/llproxy.h
+++ b/indra/llmessage/llproxy.h
@@ -218,14 +218,14 @@ enum LLSocks5AuthType
*/
class LLProxy: public LLSingleton<LLProxy>
{
- LOG_CLASS(LLProxy);
-public:
/*###########################################################################################
METHODS THAT DO NOT LOCK mProxyMutex!
###########################################################################################*/
// Constructor, cannot have parameters due to LLSingleton parent class. Call from main thread only.
- LLProxy();
+ LLSINGLETON(LLProxy);
+ LOG_CLASS(LLProxy);
+public:
// Static check for enabled status for UDP packets. Call from main thread only.
static bool isSOCKSProxyEnabled() { return sUDPProxyEnabled; }
@@ -239,9 +239,11 @@ public:
/*###########################################################################################
METHODS THAT LOCK mProxyMutex! DO NOT CALL WHILE mProxyMutex IS LOCKED!
###########################################################################################*/
+private:
// Destructor, closes open connections. Do not call directly, use cleanupClass().
~LLProxy();
+public:
// Delete LLProxy singleton. Allows the apr_socket used in the SOCKS 5 control channel to be
// destroyed before the call to apr_terminate. Call from main thread only.
static void cleanupClass();
diff --git a/indra/llmessage/llxfer_file.cpp b/indra/llmessage/llxfer_file.cpp
index 257a13f277..8e2ed890e7 100644
--- a/indra/llmessage/llxfer_file.cpp
+++ b/indra/llmessage/llxfer_file.cpp
@@ -98,12 +98,12 @@ void LLXfer_File::cleanup ()
mFp = NULL;
}
- LLFile::remove(mTempFilename);
+ LLFile::remove(mTempFilename, ENOENT);
if (mDeleteLocalOnCompletion)
{
LL_DEBUGS() << "Removing file: " << mLocalFilename << LL_ENDL;
- LLFile::remove(mLocalFilename);
+ LLFile::remove(mLocalFilename, ENOENT);
}
else
{
@@ -321,7 +321,7 @@ S32 LLXfer_File::processEOF()
mCallbackResult = flushval;
}
- LLFile::remove(mLocalFilename);
+ LLFile::remove(mLocalFilename, ENOENT);
if (!mCallbackResult)
{
diff --git a/indra/llmessage/llxfermanager.cpp b/indra/llmessage/llxfermanager.cpp
index 272dbbc785..2ceb64ce8f 100644
--- a/indra/llmessage/llxfermanager.cpp
+++ b/indra/llmessage/llxfermanager.cpp
@@ -444,7 +444,7 @@ U64 LLXferManager::requestFile(const std::string& local_filename,
&& (remote_filename.substr(remote_filename.length()-4) == ".tmp")
&& gDirUtilp->fileExists(local_filename))
{
- LLFile::remove(local_filename);
+ LLFile::remove(local_filename, ENOENT);
}
xfer_id = getNextID();
((LLXfer_File *)xferp)->initializeRequest(
diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp
index 290b67feb3..6ef4025ab1 100644
--- a/indra/llmessage/message.cpp
+++ b/indra/llmessage/message.cpp
@@ -76,6 +76,7 @@
#include "v4math.h"
#include "lltransfertargetvfile.h"
#include "llcorehttputil.h"
+#include "llpounceable.h"
// Constants
//const char* MESSAGE_LOG_FILENAME = "message.log";
@@ -1724,7 +1725,9 @@ std::ostream& operator<<(std::ostream& s, LLMessageSystem &msg)
return s;
}
-LLMessageSystem *gMessageSystem = NULL;
+// LLPounceable supports callWhenReady(), to permit clients to queue up (e.g.)
+// callback registrations for when gMessageSystem is first assigned
+LLPounceable<LLMessageSystem*, LLPounceableStatic> gMessageSystem;
// update appropriate ping info
void process_complete_ping_check(LLMessageSystem *msgsystem, void** /*user_data*/)
@@ -2641,7 +2644,7 @@ void end_messaging_system(bool print_summary)
LL_INFOS("Messaging") << str.str().c_str() << LL_ENDL;
}
- delete gMessageSystem;
+ delete static_cast<LLMessageSystem*>(gMessageSystem);
gMessageSystem = NULL;
}
}
diff --git a/indra/llmessage/message.h b/indra/llmessage/message.h
index 133db620e6..f6c5d9e228 100644
--- a/indra/llmessage/message.h
+++ b/indra/llmessage/message.h
@@ -60,6 +60,7 @@
#include "llstoredmessage.h"
#include "boost/function.hpp"
+#include "llpounceable.h"
const U32 MESSAGE_MAX_STRINGS_LENGTH = 64;
const U32 MESSAGE_NUMBER_OF_HASH_BUCKETS = 8192;
@@ -68,10 +69,10 @@ const S32 MESSAGE_MAX_PER_FRAME = 400;
class LLMessageStringTable : public LLSingleton<LLMessageStringTable>
{
-public:
- LLMessageStringTable();
+ LLSINGLETON(LLMessageStringTable);
~LLMessageStringTable();
+public:
char *getString(const char *str);
U32 mUsed;
@@ -832,7 +833,7 @@ private:
// external hook into messaging system
-extern LLMessageSystem *gMessageSystem;
+extern LLPounceable<LLMessageSystem*, LLPounceableStatic> gMessageSystem;
// Must specific overall system version, which is used to determine
// if a patch is available in the message template checksum verification.
diff --git a/indra/llmessage/tests/llhttpclient_test.cpp b/indra/llmessage/tests/llhttpclient_test.cpp
index a32bfa59ce..9356a14f1f 100644
--- a/indra/llmessage/tests/llhttpclient_test.cpp
+++ b/indra/llmessage/tests/llhttpclient_test.cpp
@@ -42,6 +42,7 @@
#include "lliosocket.h"
#include "stringize.h"
+#include "llcleanup.h"
namespace tut
{
@@ -66,7 +67,7 @@ namespace tut
~HTTPClientTestData()
{
delete mClientPump;
- LLProxy::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLProxy);
apr_pool_destroy(mPool);
}
diff --git a/indra/llmessage/tests/lltemplatemessagedispatcher_test.cpp b/indra/llmessage/tests/lltemplatemessagedispatcher_test.cpp
index 3b04530c1a..e20f61b73f 100644
--- a/indra/llmessage/tests/lltemplatemessagedispatcher_test.cpp
+++ b/indra/llmessage/tests/lltemplatemessagedispatcher_test.cpp
@@ -31,11 +31,12 @@
#include "llhost.h"
#include "message.h"
#include "llsd.h"
+#include "llpounceable.h"
#include "llhost.cpp" // Needed for copy operator
#include "net.cpp" // Needed by LLHost.
-LLMessageSystem * gMessageSystem = NULL;
+LLPounceable<LLMessageSystem*, LLPounceableStatic> gMessageSystem;
// sensor test doubles
bool gClearRecvWasCalled = false;
diff --git a/indra/llmessage/tests/lltrustedmessageservice_test.cpp b/indra/llmessage/tests/lltrustedmessageservice_test.cpp
index 55748ad27e..41f982a7e2 100644
--- a/indra/llmessage/tests/lltrustedmessageservice_test.cpp
+++ b/indra/llmessage/tests/lltrustedmessageservice_test.cpp
@@ -33,8 +33,9 @@
#include "message.h"
#include "llmessageconfig.h"
#include "llhttpnode_stub.cpp"
+#include "llpounceable.h"
-LLMessageSystem* gMessageSystem = NULL;
+LLPounceable<LLMessageSystem*, LLPounceableStatic> gMessageSystem;
LLMessageConfig::SenderTrust
LLMessageConfig::getSenderTrustedness(const std::string& msg_name)
diff --git a/indra/llmessage/tests/networkio.h b/indra/llmessage/tests/networkio.h
index 5eb739393f..5986524342 100644
--- a/indra/llmessage/tests/networkio.h
+++ b/indra/llmessage/tests/networkio.h
@@ -44,7 +44,7 @@
// init time. Use the lazy, on-demand initialization we get from LLSingleton.
class NetworkIO: public LLSingleton<NetworkIO>
{
-public:
+ LLSINGLETON(NetworkIO);
NetworkIO():
mServicePump(NULL),
mDone(false)
@@ -69,6 +69,7 @@ public:
boost::bind(&NetworkIO::done, this, _1));
}
+public:
bool pump(F32 timeout=10)
{
// Reset the done flag so we don't pop out prematurely
diff --git a/indra/llmessage/tests/test_llsdmessage_peer.py b/indra/llmessage/tests/test_llsdmessage_peer.py
index bac18fa374..9cd2959ea1 100755
--- a/indra/llmessage/tests/test_llsdmessage_peer.py
+++ b/indra/llmessage/tests/test_llsdmessage_peer.py
@@ -31,7 +31,6 @@ $/LicenseInfo$
import os
import sys
-from threading import Thread
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from llbase.fastest_elementtree import parse as xml_parse
@@ -155,17 +154,23 @@ class Server(HTTPServer):
allow_reuse_address = False
if __name__ == "__main__":
- # Instantiate a Server(TestHTTPRequestHandler) on the first free port
- # in the specified port range. Doing this inline is better than in a
- # daemon thread: if it blows up here, we'll get a traceback. If it blew up
- # in some other thread, the traceback would get eaten and we'd run the
- # subject test program anyway.
- httpd, port = freeport(xrange(8000, 8020),
- lambda port: Server(('127.0.0.1', port), TestHTTPRequestHandler))
+ # function to make a server with specified port
+ make_server = lambda port: Server(('127.0.0.1', port), TestHTTPRequestHandler)
+
+ if not sys.platform.startswith("win"):
+ # Instantiate a Server(TestHTTPRequestHandler) on a port chosen by the
+ # runtime.
+ httpd = make_server(0)
+ else:
+ # "Then there's Windows"
+ # Instantiate a Server(TestHTTPRequestHandler) on the first free port
+ # in the specified port range.
+ httpd, port = freeport(xrange(8000, 8020), make_server)
+
# Pass the selected port number to the subject test program via the
# environment. We don't want to impose requirements on the test program's
# command-line parsing -- and anyway, for C++ integration tests, that's
# performed in TUT code rather than our own.
- os.environ["PORT"] = str(port)
- debug("$PORT = %s", port)
- sys.exit(run(server=Thread(name="httpd", target=httpd.serve_forever), *sys.argv[1:]))
+ os.environ["PORT"] = str(httpd.server_port)
+ debug("$PORT = %s", httpd.server_port)
+ sys.exit(run(server_inst=httpd, *sys.argv[1:]))
diff --git a/indra/llmessage/tests/testrunner.py b/indra/llmessage/tests/testrunner.py
index 5b9beb359b..c25945067e 100755
--- a/indra/llmessage/tests/testrunner.py
+++ b/indra/llmessage/tests/testrunner.py
@@ -27,13 +27,12 @@ Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
$/LicenseInfo$
"""
-from __future__ import with_statement
-
import os
import sys
import re
import errno
import socket
+import subprocess
VERBOSE = os.environ.get("INTEGRATION_TEST_VERBOSE", "0") # default to quiet
# Support usage such as INTEGRATION_TEST_VERBOSE=off -- distressing to user if
@@ -47,6 +46,9 @@ if VERBOSE:
else:
debug = lambda *args: None
+class Error(Exception):
+ pass
+
def freeport(portlist, expr):
"""
Find a free server port to use. Specifically, evaluate 'expr' (a
@@ -141,34 +143,73 @@ def freeport(portlist, expr):
raise
def run(*args, **kwds):
- """All positional arguments collectively form a command line, executed as
- a synchronous child process.
- In addition, pass server=new_thread_instance as an explicit keyword (to
- differentiate it from an additional command-line argument).
- new_thread_instance should be an instantiated but not yet started Thread
- subclass instance, e.g.:
- run("python", "-c", 'print "Hello, world!"', server=TestHTTPServer(name="httpd"))
"""
- # If there's no server= keyword arg, don't start a server thread: simply
- # run a child process.
+ Run a specified command as a synchronous child process, optionally
+ launching a server Thread during the run.
+
+ All positional arguments collectively form a command line. The first
+ positional argument names the program file to execute.
+
+ Returns the termination code of the child process.
+
+ In addition, you may pass keyword-only arguments:
+
+ use_path=True: allow a simple filename as command and search PATH for that
+ filename. (This argument is retained for backwards compatibility but is
+ now the default behavior.)
+
+ server_inst: an instance of a subclass of SocketServer.BaseServer.
+
+ When you pass server_inst, run() calls its handle_request() method in a
+ loop until the child process terminates.
+ """
+ # server= keyword arg is discontinued
try:
thread = kwds.pop("server")
except KeyError:
pass
else:
- # Start server thread. Note that this and all other comm server
- # threads should be daemon threads: we'll let them run "forever,"
- # confident that the whole process will terminate when the main thread
- # terminates, which will be when the child process terminates.
- thread.setDaemon(True)
- thread.start()
- # choice of os.spawnv():
- # - [v vs. l] pass a list of args vs. individual arguments,
- # - [no p] don't use the PATH because we specifically want to invoke the
- # executable passed as our first arg,
- # - [no e] child should inherit this process's environment.
+ raise Error("Obsolete call to testrunner.run(): pass server_inst=, not server=")
+
debug("Running %s...", " ".join(args))
- rc = os.spawnv(os.P_WAIT, args[0], args)
+
+ try:
+ server_inst = kwds.pop("server_inst")
+ except KeyError:
+ # Without server_inst, this is very simple: just run child process.
+ rc = subprocess.call(args)
+ else:
+ # We're being asked to run a local server while the child process
+ # runs. We used to launch a daemon thread calling
+ # server_inst.serve_forever(), then eventually call sys.exit() with
+ # the daemon thread still running -- but in recent versions of Python
+ # 2, even when you call sys.exit(0), apparently killing the thread
+ # causes the Python runtime to force the process termination code
+ # nonzero. So now we avoid the extra thread altogether.
+
+ # SocketServer.BaseServer.handle_request() honors a 'timeout'
+ # attribute, if it's set to something other than None.
+ # We pick 0.5 seconds because that's the default poll timeout for
+ # BaseServer.serve_forever(), which is what we used to use.
+ server_inst.timeout = 0.5
+
+ child = subprocess.Popen(args)
+ while child.poll() is None:
+ # Setting server_inst.timeout is what keeps this handle_request()
+ # call from blocking "forever." Interestingly, looping over
+ # handle_request() with a timeout is very like the implementation
+ # of serve_forever(). We just check a different flag to break out.
+ # It might be interesting if handle_request() returned an
+ # indication of whether it in fact handled a request or timed out.
+ # Oddly, it doesn't. We could discover that by overriding
+ # handle_timeout(), whose default implementation does nothing --
+ # but in fact we really don't care. All that matters is that we
+ # regularly poll both the child process and the server socket.
+ server_inst.handle_request()
+ # We don't bother to capture the rc returned by child.poll() because
+ # poll() is already defined to capture that in its returncode attr.
+ rc = child.returncode
+
debug("%s returned %s", args[0], rc)
return rc
diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp
index d73bdd7693..76d3a405d8 100644
--- a/indra/llprimitive/lldaeloader.cpp
+++ b/indra/llprimitive/lldaeloader.cpp
@@ -855,6 +855,8 @@ struct ModelSort
bool LLDAELoader::OpenFile(const std::string& filename)
{
+ setLoadState( READING_FILE );
+
//no suitable slm exists, load from the .dae file
DAE dae;
domCOLLADA* dom;
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index 81a5537f78..20cba68f84 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -1267,6 +1267,12 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S
llassert(gGLManager.mInited);
stop_glerror();
+ if (!imageraw || imageraw->isBufferInvalid())
+ {
+ LL_WARNS() << "Trying to create a texture from invalid image data" << LL_ENDL;
+ return FALSE;
+ }
+
if (discard_level < 0)
{
llassert(mCurrentDiscardLevel >= 0);
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 69420dd0bb..3e7c69611d 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -267,7 +267,14 @@ bool LLTexUnit::bind(LLTexture* texture, bool for_rendering, bool forceBind)
}
else
{
- LL_WARNS() << "NULL LLTexUnit::bind texture" << LL_ENDL;
+ if (texture)
+ {
+ LL_DEBUGS() << "NULL LLTexUnit::bind GL image" << LL_ENDL;
+ }
+ else
+ {
+ LL_DEBUGS() << "NULL LLTexUnit::bind texture" << LL_ENDL;
+ }
return false;
}
}
@@ -286,7 +293,7 @@ bool LLTexUnit::bind(LLImageGL* texture, bool for_rendering, bool forceBind)
if(!texture)
{
- LL_WARNS() << "NULL LLTexUnit::bind texture" << LL_ENDL;
+ LL_DEBUGS() << "NULL LLTexUnit::bind texture" << LL_ENDL;
return false;
}
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 0fae600a90..31dffdd545 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -448,7 +448,7 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)
else
{
- GLenum array[] =
+ static const GLenum array[] =
{
GL_VERTEX_ARRAY,
GL_NORMAL_ARRAY,
@@ -456,7 +456,7 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)
GL_COLOR_ARRAY,
};
- GLenum mask[] =
+ static const GLenum mask[] =
{
MAP_VERTEX,
MAP_NORMAL,
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index 53720a6044..f8ef5289db 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -361,6 +361,7 @@ LLAccordionCtrlTab::LLAccordionCtrlTab(const LLAccordionCtrlTab::Params&p)
{
mStoredOpenCloseState = false;
mWasStateStored = false;
+ mSkipChangesOnNotifyParent = false;
mDropdownBGColor = LLColor4::white;
LLAccordionCtrlTabHeader::Params headerParams;
@@ -691,7 +692,7 @@ S32 LLAccordionCtrlTab::notifyParent(const LLSD& info)
mExpandedHeight = height;
- if(isExpanded())
+ if(isExpanded() && !mSkipChangesOnNotifyParent)
{
LLRect panel_rect = getRect();
panel_rect.setLeftTopAndSize( panel_rect.mLeft, panel_rect.mTop, panel_rect.getWidth(), height);
diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h
index 7a78700e0f..0263bce4be 100644
--- a/indra/llui/llaccordionctrltab.h
+++ b/indra/llui/llaccordionctrltab.h
@@ -195,6 +195,8 @@ public:
void setFitPanel( bool fit ) { mFitPanel = true; }
bool getFitParent() const { return mFitPanel; }
+ void setIgnoreResizeNotification(bool ignore) { mSkipChangesOnNotifyParent = ignore;}
+
protected:
void adjustContainerPanel (const LLRect& child_rect);
void adjustContainerPanel ();
@@ -235,6 +237,7 @@ private:
bool mStoredOpenCloseState;
bool mWasStateStored;
+ bool mSkipChangesOnNotifyParent;
bool mSelectionEnabled;
diff --git a/indra/llui/llclipboard.h b/indra/llui/llclipboard.h
index 58d80e2687..a668ac1ac6 100644
--- a/indra/llui/llclipboard.h
+++ b/indra/llui/llclipboard.h
@@ -48,10 +48,10 @@
class LLClipboard : public LLSingleton<LLClipboard>
{
-public:
- LLClipboard();
+ LLSINGLETON(LLClipboard);
~LLClipboard();
+public:
// Clears the clipboard
void reset();
// Returns the state of the clipboard so client can know if it has been modified (comparing with tracked state)
diff --git a/indra/llui/llcommandmanager.h b/indra/llui/llcommandmanager.h
index f2f2145953..8cec5e2b24 100644
--- a/indra/llui/llcommandmanager.h
+++ b/indra/llui/llcommandmanager.h
@@ -173,6 +173,9 @@ private:
class LLCommandManager
: public LLSingleton<LLCommandManager>
{
+ LLSINGLETON(LLCommandManager);
+ ~LLCommandManager();
+
public:
struct Params : public LLInitParam::Block<Params>
{
@@ -184,9 +187,6 @@ public:
}
};
- LLCommandManager();
- ~LLCommandManager();
-
U32 commandCount() const;
LLCommand * getCommand(U32 commandIndex);
LLCommand * getCommand(const LLCommandId& commandId);
diff --git a/indra/llui/llcontainerview.h b/indra/llui/llcontainerview.h
index ac92b19977..99267d978a 100644
--- a/indra/llui/llcontainerview.h
+++ b/indra/llui/llcontainerview.h
@@ -35,7 +35,9 @@
class LLScrollContainer;
struct ContainerViewRegistry : public LLChildRegistry<ContainerViewRegistry>
-{};
+{
+ LLSINGLETON_EMPTY_CTOR(ContainerViewRegistry);
+};
class LLContainerView : public LLView
{
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index 299f5e42d4..5e00bf7f45 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -105,6 +105,81 @@ bool LLFlatListView::addItem(LLPanel * item, const LLSD& value /*= LLUUID::null*
return true;
}
+bool LLFlatListView::addItemPairs(pairs_list_t panel_list, bool rearrange /*= true*/)
+{
+ if (!mItemComparator)
+ {
+ LL_WARNS_ONCE() << "No comparator specified for inserting FlatListView items." << LL_ENDL;
+ return false;
+ }
+ if (panel_list.size() == 0)
+ {
+ return false;
+ }
+
+ // presort list so that it will be easier to sort elements into mItemPairs
+ panel_list.sort(ComparatorAdaptor(*mItemComparator));
+
+ pairs_const_iterator_t new_pair_it = panel_list.begin();
+ item_pair_t* new_pair = *new_pair_it;
+ pairs_iterator_t pair_it = mItemPairs.begin();
+ item_pair_t* item_pair = *pair_it;
+
+ // sort panel_list into mItemPars
+ while (new_pair_it != panel_list.end() && pair_it != mItemPairs.end())
+ {
+ if (!new_pair->first || new_pair->first->getParent() == mItemsPanel)
+ {
+ // iterator already used or we are reusing existing panel
+ new_pair_it++;
+ new_pair = *new_pair_it;
+ }
+ else if (mItemComparator->compare(new_pair->first, item_pair->first))
+ {
+ LLPanel* panel = new_pair->first;
+
+ mItemPairs.insert(pair_it, new_pair);
+ mItemsPanel->addChild(panel);
+
+ //_4 is for MASK
+ panel->setMouseDownCallback(boost::bind(&LLFlatListView::onItemMouseClick, this, new_pair, _4));
+ panel->setRightMouseDownCallback(boost::bind(&LLFlatListView::onItemRightMouseClick, this, new_pair, _4));
+ // Children don't accept the focus
+ panel->setTabStop(false);
+ }
+ else
+ {
+ pair_it++;
+ item_pair = *pair_it;
+ }
+ }
+
+ // Add what is left of panel_list into the end of mItemPairs.
+ for (; new_pair_it != panel_list.end(); ++new_pair_it)
+ {
+ item_pair_t* item_pair = *new_pair_it;
+ LLPanel *panel = item_pair->first;
+ if (panel && panel->getParent() != mItemsPanel)
+ {
+ mItemPairs.push_back(item_pair);
+ mItemsPanel->addChild(panel);
+
+ //_4 is for MASK
+ panel->setMouseDownCallback(boost::bind(&LLFlatListView::onItemMouseClick, this, item_pair, _4));
+ panel->setRightMouseDownCallback(boost::bind(&LLFlatListView::onItemRightMouseClick, this, item_pair, _4));
+ // Children don't accept the focus
+ panel->setTabStop(false);
+ }
+ }
+
+ if (rearrange)
+ {
+ rearrangeItems();
+ notifyParentItemsRectChanged();
+ }
+ return true;
+}
+
bool LLFlatListView::insertItemAfter(LLPanel* after_item, LLPanel* item_to_add, const LLSD& value /*= LLUUID::null*/)
{
@@ -1289,6 +1364,28 @@ void LLFlatListViewEx::setFilterSubString(const std::string& filter_str)
}
}
+void LLFlatListViewEx::updateItemVisibility(LLPanel* item, const LLSD &action)
+{
+ if (!item) return;
+
+ // 0 signifies that filter is matched,
+ // i.e. we don't hide items that don't support 'match_filter' action, separators etc.
+ if (0 == item->notify(action))
+ {
+ mHasMatchedItems = true;
+ item->setVisible(true);
+ }
+ else
+ {
+ // TODO: implement (re)storing of current selection.
+ if (!mForceShowingUnmatchedItems)
+ {
+ selectItem(item, false);
+ }
+ item->setVisible(mForceShowingUnmatchedItems);
+ }
+}
+
void LLFlatListViewEx::filterItems()
{
typedef std::vector <LLPanel*> item_panel_list_t;
@@ -1309,22 +1406,7 @@ void LLFlatListViewEx::filterItems()
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))
- {
- mHasMatchedItems = true;
- pItem->setVisible(true);
- }
- else
- {
- // TODO: implement (re)storing of current selection.
- if(!mForceShowingUnmatchedItems)
- {
- selectItem(pItem, false);
- }
- pItem->setVisible(mForceShowingUnmatchedItems);
- }
+ updateItemVisibility(pItem, action);
}
sort();
diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index 92bf429031..230ea200d8 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -351,6 +351,8 @@ protected:
virtual bool removeItemPair(item_pair_t* item_pair, bool rearrange);
+ bool addItemPairs(pairs_list_t panel_list, bool rearrange = true);
+
/**
* Notify parent about changed size of internal controls with "size_changes" action
*
@@ -480,6 +482,7 @@ public:
* Sets up new filter string and filters the list.
*/
void setFilterSubString(const std::string& filter_str);
+ std::string getFilterSubString() { return mFilterSubString; }
/**
* Filters the list, rearranges and notifies parent about shape changes.
@@ -503,6 +506,14 @@ protected:
*/
void updateNoItemsMessage(const std::string& filter_string);
+ /**
+ * Applies visibility acording to action and LLFlatListView settings.
+ *
+ * @param item - item we are changing
+ * @param item - action - parameters to determin visibility from
+ */
+ void updateItemVisibility(LLPanel* item, const LLSD &action);
+
private:
std::string mNoFilteredItemsMsg;
std::string mNoItemsMsg;
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 4f664a1ccc..3ece1c12bf 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -64,8 +64,6 @@
// use this to control "jumping" behavior when Ctrl-Tabbing
const S32 TABBED_FLOATER_OFFSET = 0;
-extern LLControlGroup gSavedSettings;
-
namespace LLInitParam
{
void TypeValues<LLFloaterEnums::EOpenPositioning>::declareValues()
@@ -653,13 +651,7 @@ void LLFloater::openFloater(const LLSD& key)
&& !getFloaterHost()
&& (!getVisible() || isMinimized()))
{
- //Don't play a sound for incoming voice call based upon chat preference setting
- bool playSound = !(getName() == "incoming call" && gSavedSettings.getBOOL("PlaySoundIncomingVoiceCall") == FALSE);
-
- if(playSound)
- {
- make_ui_sound("UISndWindowOpen");
- }
+ make_ui_sound("UISndWindowOpen");
}
//RN: for now, we don't allow rehosting from one multifloater to another
diff --git a/indra/llui/llfunctorregistry.h b/indra/llui/llfunctorregistry.h
index f5364f4863..e43974bc52 100644
--- a/indra/llui/llfunctorregistry.h
+++ b/indra/llui/llfunctorregistry.h
@@ -53,14 +53,8 @@
template <typename FUNCTOR_TYPE>
class LLFunctorRegistry : public LLSingleton<LLFunctorRegistry<FUNCTOR_TYPE> >
{
- friend class LLSingleton<LLFunctorRegistry>;
+ LLSINGLETON(LLFunctorRegistry);
LOG_CLASS(LLFunctorRegistry);
-private:
- LLFunctorRegistry() : LOGFUNCTOR("LogFunctor"), DONOTHING("DoNothing")
- {
- mMap[LOGFUNCTOR] = log_functor;
- mMap[DONOTHING] = do_nothing;
- }
public:
typedef FUNCTOR_TYPE ResponseFunctor;
@@ -125,6 +119,14 @@ private:
};
template <typename FUNCTOR_TYPE>
+LLFunctorRegistry<FUNCTOR_TYPE>::LLFunctorRegistry() :
+ LOGFUNCTOR("LogFunctor"), DONOTHING("DoNothing")
+{
+ mMap[LOGFUNCTOR] = log_functor;
+ mMap[DONOTHING] = do_nothing;
+}
+
+template <typename FUNCTOR_TYPE>
class LLFunctorRegistration
{
public:
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index a245ebe1b9..f772dbc6b4 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -40,7 +40,9 @@ class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack>
public:
struct LayoutStackRegistry : public LLChildRegistry<LayoutStackRegistry>
- {};
+ {
+ LLSINGLETON_EMPTY_CTOR(LayoutStackRegistry);
+ };
struct Params : public LLInitParam::Block<Params, LLView::Params>
{
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index c89e1dac1d..becb45fa79 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -163,6 +163,9 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
{
llassert( mMaxLengthBytes > 0 );
+ LLUICtrl::setEnabled(TRUE);
+ setEnabled(p.enabled);
+
mScrollTimer.reset();
mTripleClickTimer.reset();
setText(p.default_text());
@@ -218,6 +221,13 @@ LLLineEditor::~LLLineEditor()
gFocusMgr.releaseFocusIfNeeded( this );
}
+void LLLineEditor::initFromParams(const LLLineEditor::Params& params)
+{
+ LLUICtrl::initFromParams(params);
+ LLUICtrl::setEnabled(TRUE);
+ setEnabled(params.enabled);
+}
+
void LLLineEditor::onFocusReceived()
{
gEditMenuHandler = this;
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index ccbd305a16..88468503df 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -108,6 +108,9 @@ public:
Params();
};
+
+ void initFromParams(const LLLineEditor::Params& params);
+
protected:
LLLineEditor(const Params&);
friend class LLUICtrlFactory;
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 848367f8a8..8425774d46 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -1736,6 +1736,7 @@ LLMenuGL::LLMenuGL(const LLMenuGL::Params& p)
mJumpKey(p.jump_key),
mCreateJumpKeys(p.create_jump_keys),
mNeedsArrange(FALSE),
+ mAlwaysShowMenu(FALSE),
mResetScrollPositionOnShow(true),
mShortcutPad(p.shortcut_pad)
{
@@ -3223,20 +3224,23 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)
menu->setVisible( TRUE );
- //Do not show menu if all menu items are disabled
- BOOL item_enabled = false;
- for (LLView::child_list_t::const_iterator itor = menu->getChildList()->begin();
- itor != menu->getChildList()->end();
- ++itor)
+ if(!menu->getAlwaysShowMenu())
{
- LLView *menu_item = (*itor);
- item_enabled = item_enabled || menu_item->getEnabled();
- }
+ //Do not show menu if all menu items are disabled
+ BOOL item_enabled = false;
+ for (LLView::child_list_t::const_iterator itor = menu->getChildList()->begin();
+ itor != menu->getChildList()->end();
+ ++itor)
+ {
+ LLView *menu_item = (*itor);
+ item_enabled = item_enabled || menu_item->getEnabled();
+ }
- if(!item_enabled)
- {
- menu->setVisible( FALSE );
- return;
+ if(!item_enabled)
+ {
+ menu->setVisible( FALSE );
+ return;
+ }
}
// Save click point for detecting cursor moves before mouse-up.
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 628dedb906..69f7d21513 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -347,7 +347,9 @@ private:
// child widget registry
struct MenuRegistry : public LLChildRegistry<MenuRegistry>
-{};
+{
+ LLSINGLETON_EMPTY_CTOR(MenuRegistry);
+};
class LLMenuGL
@@ -529,6 +531,9 @@ public:
void resetScrollPositionOnShow(bool reset_scroll_pos) { mResetScrollPositionOnShow = reset_scroll_pos; }
bool isScrollPositionOnShowReset() { return mResetScrollPositionOnShow; }
+ void setAlwaysShowMenu(BOOL show) { mAlwaysShowMenu = show; }
+ BOOL getAlwaysShowMenu() { return mAlwaysShowMenu; }
+
// add a context menu branch
BOOL appendContextSubMenu(LLMenuGL *menu);
@@ -570,6 +575,8 @@ private:
static LLColor4 sDefaultBackgroundColor;
static BOOL sKeyboardMode;
+ BOOL mAlwaysShowMenu;
+
LLUIColor mBackgroundColor;
BOOL mBgVisible;
LLHandle<LLView> mParentMenuItem;
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index 354add0b82..024332ee65 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -884,9 +884,9 @@ class LLNotifications :
public LLSingleton<LLNotifications>,
public LLNotificationChannelBase
{
+ LLSINGLETON(LLNotifications);
LOG_CLASS(LLNotifications);
- friend class LLSingleton<LLNotifications>;
public:
// Needed to clear up RefCounted things prior to actual destruction
@@ -966,8 +966,6 @@ public:
bool isVisibleByRules(LLNotificationPtr pNotification);
private:
- // we're a singleton, so we don't have a public constructor
- LLNotifications();
/*virtual*/ void initSingleton();
void loadPersistentNotifications();
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index c2185f24de..b8f47ef6ba 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -268,8 +268,9 @@ typedef boost::function<LLPanel* (void)> LLPanelClassCreatorFunc;
class LLRegisterPanelClass
: public LLSingleton< LLRegisterPanelClass >
{
+ LLSINGLETON_EMPTY_CTOR(LLRegisterPanelClass);
public:
- // reigister with either the provided builder, or the generic templated builder
+ // register with either the provided builder, or the generic templated builder
void addPanelClass(const std::string& tag,LLPanelClassCreatorFunc func)
{
mPanelClassesNames[tag] = func;
diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp
index 8cf72928ff..2c7e7ab13d 100644
--- a/indra/llui/llradiogroup.cpp
+++ b/indra/llui/llradiogroup.cpp
@@ -54,6 +54,7 @@ public:
/*virtual*/ void setValue(const LLSD& value);
/*virtual*/ BOOL postBuild();
+ /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
LLSD getPayload() { return mPayload; }
@@ -224,6 +225,22 @@ BOOL LLRadioGroup::setSelectedIndex(S32 index, BOOL from_event)
return TRUE;
}
+void LLRadioGroup::focusSelectedRadioBtn()
+{
+ if (mSelectedIndex >= 0)
+ {
+ LLRadioCtrl* radio_item = mRadioButtons[mSelectedIndex];
+ if (radio_item->hasTabStop() && radio_item->getEnabled())
+ {
+ radio_item->focusFirstItem(FALSE, FALSE);
+ }
+ }
+ else if (mRadioButtons[0]->hasTabStop() || hasTabStop())
+ {
+ focusFirstItem(FALSE, FALSE);
+ }
+}
+
BOOL LLRadioGroup::handleKeyHere(KEY key, MASK mask)
{
BOOL handled = FALSE;
@@ -283,19 +300,6 @@ BOOL LLRadioGroup::handleKeyHere(KEY key, MASK mask)
return handled;
}
-BOOL LLRadioGroup::handleMouseDown(S32 x, S32 y, MASK mask)
-{
- // grab focus preemptively, before child button takes mousecapture
- //
- if (hasTabStop())
- {
- focusFirstItem(FALSE, FALSE);
- }
-
- return LLUICtrl::handleMouseDown(x, y, mask);
-}
-
-
// Handle one button being clicked. All child buttons must have this
// function as their callback function.
@@ -466,6 +470,29 @@ BOOL LLRadioCtrl::postBuild()
return TRUE;
}
+BOOL LLRadioCtrl::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ // Grab focus preemptively, before button takes mousecapture
+ if (hasTabStop() && getEnabled())
+ {
+ focusFirstItem(FALSE, FALSE);
+ }
+ else
+ {
+ // Only currently selected item in group has tab stop as result it is
+ // unclear how focus should behave on click, just let the group handle
+ // focus and LLRadioGroup::onClickButton() will set correct state later
+ // if needed
+ LLRadioGroup* parent = (LLRadioGroup*)getParent();
+ if (parent)
+ {
+ parent->focusSelectedRadioBtn();
+ }
+ }
+
+ return LLCheckBoxCtrl::handleMouseDown(x, y, mask);
+}
+
LLRadioCtrl::~LLRadioCtrl()
{
}
diff --git a/indra/llui/llradiogroup.h b/indra/llui/llradiogroup.h
index 8bd5698538..dcb2f43bfe 100644
--- a/indra/llui/llradiogroup.h
+++ b/indra/llui/llradiogroup.h
@@ -66,8 +66,6 @@ public:
virtual BOOL postBuild();
- virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
-
virtual BOOL handleKeyHere(KEY key, MASK mask);
void setIndexEnabled(S32 index, BOOL enabled);
@@ -75,6 +73,8 @@ public:
S32 getSelectedIndex() const { return mSelectedIndex; }
// set the index value programatically
BOOL setSelectedIndex(S32 index, BOOL from_event = FALSE);
+ // foxus child by index if it can get focus
+ void focusSelectedRadioBtn();
// Accept and retrieve strings of the radio group control names
virtual void setValue(const LLSD& value );
diff --git a/indra/llui/llresmgr.h b/indra/llui/llresmgr.h
index a652dcd2c0..b19d8d40b8 100644
--- a/indra/llui/llresmgr.h
+++ b/indra/llui/llresmgr.h
@@ -42,9 +42,9 @@ enum LLLOCALE_ID
class LLResMgr : public LLSingleton<LLResMgr>
{
-public:
- LLResMgr();
+ LLSINGLETON(LLResMgr);
+public:
void setLocale( LLLOCALE_ID locale_id );
LLLOCALE_ID getLocale() const { return mLocale; }
diff --git a/indra/llui/llscrollcontainer.h b/indra/llui/llscrollcontainer.h
index f64cf43a8e..c4c4d0a136 100644
--- a/indra/llui/llscrollcontainer.h
+++ b/indra/llui/llscrollcontainer.h
@@ -48,7 +48,9 @@ class LLUICtrlFactory;
*****************************************************************************/
struct ScrollContainerRegistry : public LLChildRegistry<ScrollContainerRegistry>
-{};
+{
+ LLSINGLETON_EMPTY_CTOR(ScrollContainerRegistry);
+};
class LLScrollContainer : public LLUICtrl
{
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index db8fdc46b7..1190c5bb94 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -648,7 +648,7 @@ bool LLScrollListCtrl::updateColumnWidths()
S32 new_width = 0;
if (column->mRelWidth >= 0)
{
- new_width = (S32)ll_round(column->mRelWidth*mItemListRect.getWidth());
+ new_width = (S32)ll_round(column->mRelWidth * (mItemListRect.getWidth() - mTotalStaticColumnWidth - mTotalColumnPadding));
}
else if (column->mDynamicWidth)
{
@@ -2680,7 +2680,7 @@ void LLScrollListCtrl::addColumn(const LLScrollListColumn::Params& column_params
}
if (new_column->mRelWidth >= 0)
{
- new_column->setWidth((S32)ll_round(new_column->mRelWidth*mItemListRect.getWidth()));
+ new_column->setWidth((S32)ll_round(new_column->mRelWidth * (mItemListRect.getWidth() - mTotalStaticColumnWidth - mTotalColumnPadding)));
}
else if(new_column->mDynamicWidth)
{
diff --git a/indra/llui/llspellcheck.cpp b/indra/llui/llspellcheck.cpp
index 0db4281059..5a52600337 100644
--- a/indra/llui/llspellcheck.cpp
+++ b/indra/llui/llspellcheck.cpp
@@ -161,6 +161,7 @@ void LLSpellChecker::refreshDictionaryMap()
}
// Load user installed dictionary information
+ user_filename = user_path + DICT_FILE_USER;
llifstream custom_file(user_filename.c_str(), std::ios::binary);
if (custom_file.is_open())
{
diff --git a/indra/llui/llspellcheck.h b/indra/llui/llspellcheck.h
index 4ab80195ea..acac589e43 100644
--- a/indra/llui/llspellcheck.h
+++ b/indra/llui/llspellcheck.h
@@ -29,16 +29,15 @@
#include "llsingleton.h"
#include "llui.h"
+#include "llinitdestroyclass.h"
#include <boost/signals2.hpp>
class Hunspell;
class LLSpellChecker : public LLSingleton<LLSpellChecker>, public LLInitClass<LLSpellChecker>
{
- friend class LLSingleton<LLSpellChecker>;
+ LLSINGLETON(LLSpellChecker);
friend class LLInitClass<LLSpellChecker>;
-protected:
- LLSpellChecker();
~LLSpellChecker();
public:
diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp
index 8b1ba406c8..d49e216898 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -153,7 +153,7 @@ F32 clamp_precision(F32 value, S32 decimal_precision)
for (S32 i = 0; i < decimal_precision; i++)
clamped_value *= 10.0;
- clamped_value = ll_round((F32)clamped_value);
+ clamped_value = ll_round(clamped_value);
for (S32 i = 0; i < decimal_precision; i++)
clamped_value /= 10.0;
diff --git a/indra/llui/llstatbar.cpp b/indra/llui/llstatbar.cpp
index 35f5330a3f..6c8e63442b 100644
--- a/indra/llui/llstatbar.cpp
+++ b/indra/llui/llstatbar.cpp
@@ -40,6 +40,7 @@
#include "lltooltip.h"
#include "lllocalcliprect.h"
#include <iostream>
+#include "lltrans.h"
// rate at which to update display of value that is rapidly changing
const F32 MEAN_VALUE_UPDATE_TIME = 1.f / 4.f;
@@ -619,19 +620,19 @@ void LLStatBar::drawLabelAndValue( F32 value, std::string &label, LLRect &bar_re
std::string value_str = !llisnan(value)
? llformat("%10.*f %s", decimal_digits, value, label.c_str())
- : "n/a";
+ : LLTrans::getString("na");
// Draw the current value.
if (mOrientation == HORIZONTAL)
{
LLFontGL::getFontMonospace()->renderUTF8(value_str, 0, bar_rect.mRight, getRect().getHeight(),
- LLColor4(1.f, 1.f, 1.f, 0.5f),
+ LLColor4(1.f, 1.f, 1.f, 1.f),
LLFontGL::RIGHT, LLFontGL::TOP);
}
else
{
LLFontGL::getFontMonospace()->renderUTF8(value_str, 0, bar_rect.mRight, getRect().getHeight(),
- LLColor4(1.f, 1.f, 1.f, 0.5f),
+ LLColor4(1.f, 1.f, 1.f, 1.f),
LLFontGL::RIGHT, LLFontGL::TOP);
}
}
diff --git a/indra/llui/llstatview.h b/indra/llui/llstatview.h
index bc78d3b5fd..af4db7d7ea 100644
--- a/indra/llui/llstatview.h
+++ b/indra/llui/llstatview.h
@@ -35,7 +35,9 @@ class LLStatBar;
// widget registrars
struct StatViewRegistry : public LLChildRegistry<StatViewRegistry>
-{};
+{
+ LLSINGLETON_EMPTY_CTOR(StatViewRegistry);
+};
class LLStatView : public LLContainerView
{
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 701a06a085..1b2f09cff5 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -210,6 +210,7 @@ LLTabContainer::Params::Params()
label_pad_left("label_pad_left"),
tab_position("tab_position"),
hide_tabs("hide_tabs", false),
+ hide_scroll_arrows("hide_scroll_arrows", false),
tab_padding_right("tab_padding_right"),
first_tab("first_tab"),
middle_tab("middle_tab"),
@@ -240,6 +241,7 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p)
mPrevArrowBtn(NULL),
mNextArrowBtn(NULL),
mIsVertical( p.tab_position == LEFT ),
+ mHideScrollArrows(p.hide_scroll_arrows),
// Horizontal Specific
mJumpPrevArrowBtn(NULL),
mJumpNextArrowBtn(NULL),
@@ -409,7 +411,7 @@ void LLTabContainer::draw()
setScrollPosPixels((S32)lerp((F32)getScrollPosPixels(), (F32)target_pixel_scroll, LLSmoothInterpolation::getInterpolant(0.08f)));
- BOOL has_scroll_arrows = !getTabsHidden() && ((mMaxScrollPos > 0) || (mScrollPosPixels > 0));
+ BOOL has_scroll_arrows = !mHideScrollArrows && !getTabsHidden() && ((mMaxScrollPos > 0) || (mScrollPosPixels > 0));
if (!mIsVertical)
{
mJumpPrevArrowBtn->setVisible( has_scroll_arrows );
@@ -517,7 +519,7 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask )
{
static LLUICachedControl<S32> tabcntrv_pad ("UITabCntrvPad", 0);
BOOL handled = FALSE;
- BOOL has_scroll_arrows = (getMaxScrollPos() > 0) && !getTabsHidden();
+ BOOL has_scroll_arrows = !mHideScrollArrows && (getMaxScrollPos() > 0) && !getTabsHidden();
if (has_scroll_arrows)
{
@@ -591,7 +593,7 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask )
BOOL LLTabContainer::handleHover( S32 x, S32 y, MASK mask )
{
BOOL handled = FALSE;
- BOOL has_scroll_arrows = (getMaxScrollPos() > 0) && !getTabsHidden();
+ BOOL has_scroll_arrows = !mHideScrollArrows && (getMaxScrollPos() > 0) && !getTabsHidden();
if (has_scroll_arrows)
{
@@ -633,7 +635,7 @@ BOOL LLTabContainer::handleHover( S32 x, S32 y, MASK mask )
BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask )
{
BOOL handled = FALSE;
- BOOL has_scroll_arrows = (getMaxScrollPos() > 0) && !getTabsHidden();
+ BOOL has_scroll_arrows = !mHideScrollArrows && (getMaxScrollPos() > 0) && !getTabsHidden();
S32 local_x = x - getRect().mLeft;
S32 local_y = y - getRect().mBottom;
@@ -701,7 +703,7 @@ BOOL LLTabContainer::handleToolTip( S32 x, S32 y, MASK mask)
{
LLTabTuple* firsttuple = getTab(0);
- BOOL has_scroll_arrows = (getMaxScrollPos() > 0);
+ BOOL has_scroll_arrows = !mHideScrollArrows && (getMaxScrollPos() > 0);
LLRect clip;
if (mIsVertical)
{
@@ -826,7 +828,7 @@ BOOL LLTabContainer::handleKeyHere(KEY key, MASK mask)
// virtual
BOOL LLTabContainer::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType type, void* cargo_data, EAcceptance *accept, std::string &tooltip)
{
- BOOL has_scroll_arrows = (getMaxScrollPos() > 0);
+ BOOL has_scroll_arrows = !mHideScrollArrows && (getMaxScrollPos() > 0);
if(mOpenTabsOnDragAndDrop && !getTabsHidden())
{
@@ -1543,7 +1545,7 @@ BOOL LLTabContainer::setTab(S32 which)
is_visible = FALSE;
}
}
- else if (getMaxScrollPos() > 0)
+ else if (!mHideScrollArrows && getMaxScrollPos() > 0)
{
if( i < getScrollPos() )
{
diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h
index 057809dc42..4a5f08f5d3 100644
--- a/indra/llui/lltabcontainer.h
+++ b/indra/llui/lltabcontainer.h
@@ -83,6 +83,7 @@ public:
label_pad_left;
Optional<bool> hide_tabs;
+ Optional<bool> hide_scroll_arrows;
Optional<S32> tab_padding_right;
Optional<TabParams> first_tab,
@@ -262,6 +263,7 @@ private:
S32 mCurrentTabIdx;
BOOL mTabsHidden;
+ BOOL mHideScrollArrows;
BOOL mScrolled;
LLFrameTimer mScrollTimer;
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 20be739286..88a5c3a587 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1522,6 +1522,7 @@ void LLTextBase::reflow()
}
S32 line_height = 0;
+ S32 seg_line_offset = line_count;
while(seg_iter != mSegments.end())
{
@@ -1534,7 +1535,8 @@ void LLTextBase::reflow()
S32 character_count = segment->getNumChars(getWordWrap() ? llmax(0, remaining_pixels) : S32_MAX,
seg_offset,
cur_index - line_start_index,
- S32_MAX);
+ S32_MAX,
+ line_count - seg_line_offset);
S32 segment_width, segment_height;
bool force_newline = segment->getDimensions(seg_offset, character_count, segment_width, segment_height);
@@ -1597,6 +1599,7 @@ void LLTextBase::reflow()
}
++seg_iter;
seg_offset = 0;
+ seg_line_offset = force_newline ? line_count + 1 : line_count;
}
if (force_newline)
{
@@ -3065,7 +3068,7 @@ LLTextSegment::~LLTextSegment()
bool LLTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const { width = 0; height = 0; return false;}
S32 LLTextSegment::getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const { return 0; }
-S32 LLTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const { return 0; }
+S32 LLTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const { return 0; }
void LLTextSegment::updateLayout(const LLTextBase& editor) {}
F32 LLTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect) { return draw_rect.mLeft; }
bool LLTextSegment::canEdit() const { return false; }
@@ -3335,7 +3338,7 @@ S32 LLNormalTextSegment::getOffset(S32 segment_local_x_coord, S32 start_offset,
round);
}
-S32 LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const
+S32 LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const
{
const LLWString &text = getWText();
@@ -3352,7 +3355,7 @@ S32 LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin
// if no character yet displayed on this line, don't require word wrapping since
// we can just move to the next line, otherwise insist on it so we make forward progress
- LLFontGL::EWordWrapStyle word_wrap_style = (line_offset == 0)
+ LLFontGL::EWordWrapStyle word_wrap_style = (line_offset == 0)
? LLFontGL::WORD_BOUNDARY_IF_POSSIBLE
: LLFontGL::ONLY_WORD_BOUNDARIES;
@@ -3490,12 +3493,26 @@ LLInlineViewSegment::~LLInlineViewSegment()
bool LLInlineViewSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const
{
- if (first_char == 0 && num_chars == 0)
+ if (first_char == 0 && num_chars == 0)
{
- // we didn't fit on a line, the widget will fall on the next line
- // so dimensions here are 0
+ // We didn't fit on a line or were forced to new string
+ // the widget will fall on the next line, so width here is 0
width = 0;
- height = 0;
+
+ if (mForceNewLine)
+ {
+ // Chat, string can't be smaller then font height even if it is empty
+ LLStyleSP s(new LLStyle(LLStyle::Params().visible(true)));
+ height = s->getFont()->getLineHeight();
+
+ return true; // new line
+ }
+ else
+ {
+ // height from previous segment in same string will be used, word-wrap
+ height = 0;
+ }
+
}
else
{
@@ -3506,13 +3523,16 @@ bool LLInlineViewSegment::getDimensions(S32 first_char, S32 num_chars, S32& widt
return false;
}
-S32 LLInlineViewSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const
+S32 LLInlineViewSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const
{
// if putting a widget anywhere but at the beginning of a line
// and the widget doesn't fit or mForceNewLine is true
// then return 0 chars for that line, and all characters for the next
- if (line_offset != 0
- && (mForceNewLine || num_pixels < mView->getRect().getWidth()))
+ if (mForceNewLine && line_ind == 0)
+ {
+ return 0;
+ }
+ else if (line_offset != 0 && num_pixels < mView->getRect().getWidth())
{
return 0;
}
@@ -3565,7 +3585,7 @@ bool LLLineBreakTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& w
return true;
}
-S32 LLLineBreakTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const
+S32 LLLineBreakTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const
{
return 1;
}
@@ -3601,7 +3621,7 @@ bool LLImageTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width
return false;
}
-S32 LLImageTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const
+S32 LLImageTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const
{
LLUIImagePtr image = mStyle->getImage();
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 3d3a6ca869..c7b6203445 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -64,7 +64,19 @@ public:
virtual bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const;
virtual S32 getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const;
- virtual S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const;
+
+ /**
+ * Get number of chars that fit into free part of current line.
+ *
+ * @param num_pixels - maximum width of rect
+ * @param segment_offset - symbol in segment we start processing line from
+ * @param line_offset - symbol in line after which segment starts
+ * @param max_chars - limit of symbols that will fit in current line
+ * @param line_ind - index of not word-wrapped string inside segment for multi-line segments.
+ * Two string separated by word-wrap will have same index.
+ * @return number of chars that will fit into current line
+ */
+ virtual S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const;
virtual void updateLayout(const class LLTextBase& editor);
virtual F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);
virtual bool canEdit() const;
@@ -116,7 +128,7 @@ public:
/*virtual*/ bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const;
/*virtual*/ S32 getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const;
- /*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const;
+ /*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const;
/*virtual*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);
/*virtual*/ bool canEdit() const { return true; }
/*virtual*/ const LLColor4& getColor() const { return mStyle->getColor(); }
@@ -201,7 +213,7 @@ public:
LLInlineViewSegment(const Params& p, S32 start, S32 end);
~LLInlineViewSegment();
/*virtual*/ bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const;
- /*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const;
+ /*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const;
/*virtual*/ void updateLayout(const class LLTextBase& editor);
/*virtual*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);
/*virtual*/ bool canEdit() const { return false; }
@@ -225,7 +237,7 @@ public:
LLLineBreakTextSegment(S32 pos);
~LLLineBreakTextSegment();
bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const;
- S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const;
+ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const;
F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);
private:
@@ -238,7 +250,7 @@ public:
LLImageTextSegment(LLStyleConstSP style,S32 pos,class LLTextBase& editor);
~LLImageTextSegment();
bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const;
- S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const;
+ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 char_offset, S32 max_chars, S32 line_ind) const;
F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);
/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
diff --git a/indra/llui/lltextparser.h b/indra/llui/lltextparser.h
index 400aeeb8be..3d71e40452 100644
--- a/indra/llui/lltextparser.h
+++ b/indra/llui/lltextparser.h
@@ -37,14 +37,14 @@ class LLColor4;
class LLTextParser : public LLSingleton<LLTextParser>
{
+ LLSINGLETON(LLTextParser);
+
public:
typedef enum e_condition_type { CONTAINS, MATCHES, STARTS_WITH, ENDS_WITH } EConditionType;
typedef enum e_highlight_type { PART, ALL } EHighlightType;
typedef enum e_highlight_position { WHOLE, START, MIDDLE, END } EHighlightPosition;
typedef enum e_dialog_action { ACTION_NONE, ACTION_CLOSE, ACTION_ADD, ACTION_COPY, ACTION_UPDATE } EDialogAction;
- LLTextParser();
-
LLSD parsePartialLineHighlights(const std::string &text,const LLColor4 &color, EHighlightPosition part=WHOLE, S32 index=0);
bool parseFullLineHighlights(const std::string &text, LLColor4 *color);
diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h
index fad127fc4c..0b1fbe5367 100644
--- a/indra/llui/lltooltip.h
+++ b/indra/llui/lltooltip.h
@@ -129,9 +129,10 @@ public:
class LLToolTipMgr : public LLSingleton<LLToolTipMgr>
{
+ LLSINGLETON(LLToolTipMgr);
LOG_CLASS(LLToolTipMgr);
+
public:
- LLToolTipMgr();
void show(const LLToolTip::Params& params);
void show(const std::string& message);
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index f790d8e005..770f13c1c3 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -60,6 +60,7 @@
#include "llflyoutbutton.h"
#include "llsearcheditor.h"
#include "lltoolbar.h"
+#include "llcleanup.h"
// for XUIParse
#include "llquaternion.h"
@@ -208,7 +209,7 @@ void LLUI::initClass(const settings_map_t& settings,
void LLUI::cleanupClass()
{
- LLRender2D::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLRender2D);
}
void LLUI::setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t& remove_popup, const clear_popups_t& clear_popups)
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index c727f75c4f..d7151dbee9 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -344,95 +344,6 @@ private:
// Moved LLLocalClipRect to lllocalcliprect.h
-class LLCallbackRegistry
-{
-public:
- typedef boost::signals2::signal<void()> callback_signal_t;
-
- void registerCallback(const callback_signal_t::slot_type& slot)
- {
- mCallbacks.connect(slot);
- }
-
- void fireCallbacks()
- {
- mCallbacks();
- }
-
-private:
- callback_signal_t mCallbacks;
-};
-
-class LLInitClassList :
- public LLCallbackRegistry,
- public LLSingleton<LLInitClassList>
-{
- friend class LLSingleton<LLInitClassList>;
-private:
- LLInitClassList() {}
-};
-
-class LLDestroyClassList :
- public LLCallbackRegistry,
- public LLSingleton<LLDestroyClassList>
-{
- friend class LLSingleton<LLDestroyClassList>;
-private:
- LLDestroyClassList() {}
-};
-
-template<typename T>
-class LLRegisterWith
-{
-public:
- LLRegisterWith(boost::function<void ()> func)
- {
- T::instance().registerCallback(func);
- }
-
- // this avoids a MSVC bug where non-referenced static members are "optimized" away
- // even if their constructors have side effects
- S32 reference()
- {
- S32 dummy;
- dummy = 0;
- return dummy;
- }
-};
-
-template<typename T>
-class LLInitClass
-{
-public:
- LLInitClass() { sRegister.reference(); }
-
- static LLRegisterWith<LLInitClassList> sRegister;
-private:
-
- static void initClass()
- {
- LL_ERRS() << "No static initClass() method defined for " << typeid(T).name() << LL_ENDL;
- }
-};
-
-template<typename T>
-class LLDestroyClass
-{
-public:
- LLDestroyClass() { sRegister.reference(); }
-
- static LLRegisterWith<LLDestroyClassList> sRegister;
-private:
-
- static void destroyClass()
- {
- LL_ERRS() << "No static destroyClass() method defined for " << typeid(T).name() << LL_ENDL;
- }
-};
-
-template <typename T> LLRegisterWith<LLInitClassList> LLInitClass<T>::sRegister(&T::initClass);
-template <typename T> LLRegisterWith<LLDestroyClassList> LLDestroyClass<T>::sRegister(&T::destroyClass);
-
// useful parameter blocks
struct TimeIntervalParam : public LLInitParam::ChoiceBlock<TimeIntervalParam>
{
diff --git a/indra/llui/lluicolortable.h b/indra/llui/lluicolortable.h
index 6a7a681d57..44472070cc 100644
--- a/indra/llui/lluicolortable.h
+++ b/indra/llui/lluicolortable.h
@@ -38,7 +38,8 @@ class LLUIColor;
class LLUIColorTable : public LLSingleton<LLUIColorTable>
{
-LOG_CLASS(LLUIColorTable);
+ LLSINGLETON_EMPTY_CTOR(LLUIColorTable);
+ LOG_CLASS(LLUIColorTable);
// consider using sorted vector, can be much faster
typedef std::map<std::string, LLUIColor> string_color_map_t;
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index 99553ee0d2..550bee5c70 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -258,18 +258,25 @@ public:
class LLTextInputFilter : public LLQueryFilter, public LLSingleton<LLTextInputFilter>
{
+ LLSINGLETON_EMPTY_CTOR(LLTextInputFilter);
/*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const
{
return filterResult_t(view->isCtrl() && static_cast<const LLUICtrl *>(view)->acceptsTextInput(), TRUE);
}
};
-
+
template <typename F, typename DERIVED> class CallbackRegistry : public LLRegistrySingleton<std::string, F, DERIVED >
{};
- class CommitCallbackRegistry : public CallbackRegistry<commit_callback_t, CommitCallbackRegistry>{};
+ class CommitCallbackRegistry : public CallbackRegistry<commit_callback_t, CommitCallbackRegistry>
+ {
+ LLSINGLETON_EMPTY_CTOR(CommitCallbackRegistry);
+ };
// the enable callback registry is also used for visiblity callbacks
- class EnableCallbackRegistry : public CallbackRegistry<enable_callback_t, EnableCallbackRegistry>{};
+ class EnableCallbackRegistry : public CallbackRegistry<enable_callback_t, EnableCallbackRegistry>
+ {
+ LLSINGLETON_EMPTY_CTOR(EnableCallbackRegistry);
+ };
protected:
diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp
index 4cc7da1267..fdefae01b1 100644
--- a/indra/llui/lluictrlfactory.cpp
+++ b/indra/llui/lluictrlfactory.cpp
@@ -92,15 +92,27 @@ void LLUICtrlFactory::loadWidgetTemplate(const std::string& widget_tag, LLInitPa
{
std::string filename = gDirUtilp->add("widgets", widget_tag + ".xml");
LLXMLNodePtr root_node;
+ std::vector<std::string> search_paths =
+ gDirUtilp->findSkinnedFilenames(LLDir::XUI, filename);
- // Here we're looking for the "en" version, the default-language version
- // of the file, rather than the localized version.
- std::string full_filename = gDirUtilp->findSkinnedFilenameBaseLang(LLDir::XUI, filename);
- if (!full_filename.empty())
+ if (search_paths.empty())
{
- LLUICtrlFactory::instance().pushFileName(full_filename);
- LLSimpleXUIParser parser;
- parser.readXUI(full_filename, block);
+ return;
+ }
+
+ // "en" version, the default-language version of the file.
+ std::string base_filename = search_paths.front();
+ if (!base_filename.empty())
+ {
+ LLUICtrlFactory::instance().pushFileName(base_filename);
+
+ if (!LLXMLNode::getLayeredXMLNode(root_node, search_paths))
+ {
+ LL_WARNS() << "Couldn't parse widget from: " << base_filename << LL_ENDL;
+ return;
+ }
+ LLXUIParser parser;
+ parser.readXUI(root_node, block, base_filename);
LLUICtrlFactory::instance().popFileName();
}
}
diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h
index 3ce39c947f..03d946f1b7 100644
--- a/indra/llui/lluictrlfactory.h
+++ b/indra/llui/lluictrlfactory.h
@@ -33,6 +33,8 @@
#include "llxuiparser.h"
#include "llstl.h"
#include "lldir.h"
+#include "llsingleton.h"
+#include "llheteromap.h"
class LLView;
@@ -57,22 +59,24 @@ protected:
class LLDefaultChildRegistry : public LLChildRegistry<LLDefaultChildRegistry>
{
-protected:
- LLDefaultChildRegistry(){}
- friend class LLSingleton<LLDefaultChildRegistry>;
+ LLSINGLETON_EMPTY_CTOR(LLDefaultChildRegistry);
};
// lookup widget name by type
class LLWidgetNameRegistry
: public LLRegistrySingleton<const std::type_info*, std::string, LLWidgetNameRegistry>
-{};
+{
+ LLSINGLETON_EMPTY_CTOR(LLWidgetNameRegistry);
+};
// lookup function for generating empty param block by widget type
// this is used for schema generation
//typedef const LLInitParam::BaseBlock& (*empty_param_block_func_t)();
//class LLDefaultParamBlockRegistry
//: public LLRegistrySingleton<const std::type_info*, empty_param_block_func_t, LLDefaultParamBlockRegistry>
-//{};
+//{
+// LLSINGLETON(LLDefaultParamBlockRegistry);
+//};
extern LLTrace::BlockTimerStatHandle FTM_WIDGET_SETUP;
extern LLTrace::BlockTimerStatHandle FTM_WIDGET_CONSTRUCTION;
@@ -85,31 +89,15 @@ extern template class LLUICtrlFactory* LLSingleton<class LLUICtrlFactory>::getIn
class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory>
{
-private:
- friend class LLSingleton<LLUICtrlFactory>;
- LLUICtrlFactory();
+ LLSINGLETON(LLUICtrlFactory);
~LLUICtrlFactory();
// only partial specialization allowed in inner classes, so use extra dummy parameter
template <typename PARAM_BLOCK, int DUMMY>
- class ParamDefaults : public LLSingleton<ParamDefaults<PARAM_BLOCK, DUMMY> >
+ class ParamDefaults
{
public:
- ParamDefaults()
- {
- // look up template file for this param block...
- const std::string* param_block_tag = LLWidgetNameRegistry::instance().getValue(&typeid(PARAM_BLOCK));
- if (param_block_tag)
- { // ...and if it exists, back fill values using the most specific template first
- PARAM_BLOCK params;
- LLUICtrlFactory::loadWidgetTemplate(*param_block_tag, params);
- mPrototype.fillFrom(params);
- }
- // recursively fill from base class param block
- ((typename PARAM_BLOCK::base_block_t&)mPrototype).fillFrom(ParamDefaults<typename PARAM_BLOCK::base_block_t, DUMMY>::instance().get());
-
- }
-
+ ParamDefaults();
const PARAM_BLOCK& get() { return mPrototype; }
private:
@@ -118,9 +106,10 @@ private:
// base case for recursion, there are NO base classes of LLInitParam::BaseBlock
template<int DUMMY>
- class ParamDefaults<LLInitParam::BaseBlock, DUMMY> : public LLSingleton<ParamDefaults<LLInitParam::BaseBlock, DUMMY> >
+ class ParamDefaults<LLInitParam::BaseBlock, DUMMY>
{
public:
+ ParamDefaults();
const LLInitParam::BaseBlock& get() { return mBaseBlock; }
private:
LLInitParam::BaseBlock mBaseBlock;
@@ -132,7 +121,7 @@ public:
template<typename T>
static const typename T::Params& getDefaultParams()
{
- return ParamDefaults<typename T::Params, 0>::instance().get();
+ return instance().mParamDefaultsMap.obtain< ParamDefaults<typename T::Params, 0> >().get();
}
// Does what you want for LLFloaters and LLPanels
@@ -147,7 +136,8 @@ public:
template<typename T>
static T* create(typename T::Params& params, LLView* parent = NULL)
{
- params.fillFrom(ParamDefaults<typename T::Params, 0>::instance().get());
+ params.fillFrom(instance().mParamDefaultsMap.obtain<
+ ParamDefaults<typename T::Params, 0> >().get());
T* widget = createWidgetImpl<T>(params, parent);
if (widget)
@@ -295,8 +285,40 @@ private:
class LLPanel* mDummyPanel;
std::vector<std::string> mFileNames;
+
+ // store ParamDefaults specializations
+ // Each ParamDefaults specialization used to be an LLSingleton in its own
+ // right. But the 2016 changes to the LLSingleton mechanism, making
+ // LLSingleton instances polymorphic, are incompatible with current
+ // LLInitParam::BaseBlock functionality. (Thanks NickyD for spotting
+ // that!) Moreover, instances of the private nested ParamDefaults template
+ // aren't global resources -- which is what LLSingleton is designed for.
+ // This is simply a cache looked up by type. Its lifespan is tied to
+ // LLUICtrlFactory. Use LLHeteroMap for this cache.
+ LLHeteroMap mParamDefaultsMap;
};
+template <typename PARAM_BLOCK, int DUMMY>
+LLUICtrlFactory::ParamDefaults<PARAM_BLOCK, DUMMY>::ParamDefaults()
+{
+ // look up template file for this param block...
+ const std::string* param_block_tag = LLWidgetNameRegistry::instance().getValue(&typeid(PARAM_BLOCK));
+ if (param_block_tag)
+ { // ...and if it exists, back fill values using the most specific template first
+ PARAM_BLOCK params;
+ LLUICtrlFactory::loadWidgetTemplate(*param_block_tag, params);
+ mPrototype.fillFrom(params);
+ }
+ // recursively fill from base class param block
+ ((typename PARAM_BLOCK::base_block_t&)mPrototype).fillFrom(
+ LLUICtrlFactory::instance().mParamDefaultsMap.obtain<
+ ParamDefaults<typename PARAM_BLOCK::base_block_t, DUMMY> >().get());
+
+}
+
+template <int DUMMY>
+LLUICtrlFactory::ParamDefaults<LLInitParam::BaseBlock, DUMMY>::ParamDefaults() {}
+
// this is here to make gcc happy with reference to LLUICtrlFactory
template<typename DERIVED>
template<typename T>
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 27a2456deb..05b7a4a9e9 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -764,7 +764,7 @@ LLUrlEntryAgentCompleteName::LLUrlEntryAgentCompleteName()
std::string LLUrlEntryAgentCompleteName::getName(const LLAvatarName& avatar_name)
{
- return avatar_name.getCompleteName();
+ return avatar_name.getCompleteName(true, true);
}
//
@@ -780,7 +780,7 @@ LLUrlEntryAgentDisplayName::LLUrlEntryAgentDisplayName()
std::string LLUrlEntryAgentDisplayName::getName(const LLAvatarName& avatar_name)
{
- return avatar_name.getDisplayName();
+ return avatar_name.getDisplayName(true);
}
//
@@ -1377,7 +1377,7 @@ std::string LLUrlEntryIcon::getIcon(const std::string &url)
LLUrlEntryEmail::LLUrlEntryEmail()
: LLUrlEntryBase()
{
- mPattern = boost::regex("(mailto:)?[\\w\\.\\-]+@[\\w\\.\\-]+\\.[a-z]{2,6}",
+ mPattern = boost::regex("(mailto:)?[\\w\\.\\-]+@[\\w\\.\\-]+\\.[a-z]{2,63}",
boost::regex::perl | boost::regex::icase);
mMenuName = "menu_url_email.xml";
mTooltip = LLTrans::getString("TooltipEmail");
diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h
index 24c3a2b513..efafe543ab 100644
--- a/indra/llui/llurlregistry.h
+++ b/indra/llui/llurlregistry.h
@@ -62,9 +62,9 @@ void LLUrlRegistryNullCallback(const std::string &url,
///
class LLUrlRegistry : public LLSingleton<LLUrlRegistry>
{
-public:
+ LLSINGLETON(LLUrlRegistry);
~LLUrlRegistry();
-
+public:
/// add a new Url handler to the registry (will be freed on destruction)
/// optionally force it to the front of the list, making it take
/// priority over other regular expression matches for URLs
@@ -89,9 +89,6 @@ public:
bool isUrl(const LLWString &text);
private:
- LLUrlRegistry();
- friend class LLSingleton<LLUrlRegistry>;
-
std::vector<LLUrlEntryBase *> mUrlEntry;
LLUrlEntryBase* mUrlEntryTrusted;
LLUrlEntryBase* mUrlEntryIcon;
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 9604e5ce10..89ad8138d8 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -1912,6 +1912,7 @@ private:
class SortByTabOrder : public LLQuerySorter, public LLSingleton<SortByTabOrder>
{
+ LLSINGLETON_EMPTY_CTOR(SortByTabOrder);
/*virtual*/ void sort(LLView * parent, LLView::child_list_t &children) const
{
children.sort(CompareByTabOrder(parent->getTabOrder(), parent->getDefaultTabGroup()));
@@ -1935,6 +1936,7 @@ const LLViewQuery & LLView::getTabOrderQuery()
// This class is only used internally by getFocusRootsQuery below.
class LLFocusRootsFilter : public LLQueryFilter, public LLSingleton<LLFocusRootsFilter>
{
+ LLSINGLETON_EMPTY_CTOR(LLFocusRootsFilter);
/*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const
{
return filterResult_t(view->isCtrl() && view->isFocusRoot(), !view->isFocusRoot());
diff --git a/indra/llui/llviewereventrecorder.h b/indra/llui/llviewereventrecorder.h
index 375efcc3de..d1059d55de 100644
--- a/indra/llui/llviewereventrecorder.h
+++ b/indra/llui/llviewereventrecorder.h
@@ -44,13 +44,10 @@
class LLViewerEventRecorder : public LLSingleton<LLViewerEventRecorder>
{
-
- public:
-
- LLViewerEventRecorder(); // TODO Protect constructor better if we can (not happy in private section) - could add a factory... - we are singleton
+ LLSINGLETON(LLViewerEventRecorder);
~LLViewerEventRecorder();
-
+ public:
void updateMouseEventInfo(S32 local_x,S32 local_y, S32 global_x, S32 global_y, std::string mName);
void setMouseLocalCoords(S32 x,S32 y);
void setMouseGlobalCoords(S32 x,S32 y);
diff --git a/indra/llui/llviewquery.h b/indra/llui/llviewquery.h
index 9044c4ff29..21bb1be26f 100644
--- a/indra/llui/llviewquery.h
+++ b/indra/llui/llviewquery.h
@@ -54,31 +54,37 @@ public:
class LLLeavesFilter : public LLQueryFilter, public LLSingleton<LLLeavesFilter>
{
+ LLSINGLETON_EMPTY_CTOR(LLLeavesFilter);
/*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
};
class LLRootsFilter : public LLQueryFilter, public LLSingleton<LLRootsFilter>
{
+ LLSINGLETON_EMPTY_CTOR(LLRootsFilter);
/*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
};
class LLVisibleFilter : public LLQueryFilter, public LLSingleton<LLVisibleFilter>
{
+ LLSINGLETON_EMPTY_CTOR(LLVisibleFilter);
/*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
};
class LLEnabledFilter : public LLQueryFilter, public LLSingleton<LLEnabledFilter>
{
+ LLSINGLETON_EMPTY_CTOR(LLEnabledFilter);
/*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
};
class LLTabStopFilter : public LLQueryFilter, public LLSingleton<LLTabStopFilter>
{
+ LLSINGLETON_EMPTY_CTOR(LLTabStopFilter);
/*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
};
class LLCtrlFilter : public LLQueryFilter, public LLSingleton<LLCtrlFilter>
{
+ LLSINGLETON_EMPTY_CTOR(LLCtrlFilter);
/*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
};
diff --git a/indra/llui/llxuiparser.h b/indra/llui/llxuiparser.h
index ad2a39cab7..eb0eac8194 100644
--- a/indra/llui/llxuiparser.h
+++ b/indra/llui/llxuiparser.h
@@ -41,7 +41,9 @@ class LLView;
// lookup widget type by name
class LLWidgetTypeRegistry
: public LLRegistrySingleton<std::string, const std::type_info*, LLWidgetTypeRegistry>
-{};
+{
+ LLSINGLETON_EMPTY_CTOR(LLWidgetTypeRegistry);
+};
// global static instance for registering all widget types
@@ -51,7 +53,9 @@ typedef LLRegistry<std::string, LLWidgetCreatorFunc> widget_registry_t;
class LLChildRegistryRegistry
: public LLRegistrySingleton<const std::type_info*, widget_registry_t, LLChildRegistryRegistry>
-{};
+{
+ LLSINGLETON_EMPTY_CTOR(LLChildRegistryRegistry);
+};
class LLXSDWriter : public LLInitParam::Parser
{
@@ -60,7 +64,7 @@ public:
void writeXSD(const std::string& name, LLXMLNodePtr node, const LLInitParam::BaseBlock& block, const std::string& xml_namespace);
/*virtual*/ std::string getCurrentElementName() { return LLStringUtil::null; }
-
+ /*virtual*/ std::string getCurrentFileName() { return LLStringUtil::null; }
LLXSDWriter();
~LLXSDWriter();
@@ -98,6 +102,7 @@ public:
typedef LLInitParam::Parser::name_stack_t name_stack_t;
/*virtual*/ std::string getCurrentElementName();
+ /*virtual*/ std::string getCurrentFileName() { return mCurFileName; }
/*virtual*/ void parserWarning(const std::string& message);
/*virtual*/ void parserError(const std::string& message);
@@ -200,6 +205,7 @@ public:
virtual ~LLSimpleXUIParser();
/*virtual*/ std::string getCurrentElementName();
+ /*virtual*/ std::string getCurrentFileName() { return mCurFileName; }
/*virtual*/ void parserWarning(const std::string& message);
/*virtual*/ void parserError(const std::string& message);
diff --git a/indra/llui/tests/llurlentry_stub.cpp b/indra/llui/tests/llurlentry_stub.cpp
index f01178c374..338be1808d 100644..100755
--- a/indra/llui/tests/llurlentry_stub.cpp
+++ b/indra/llui/tests/llurlentry_stub.cpp
@@ -31,6 +31,7 @@
#include "llcachename.h"
#include "lluuid.h"
#include "message.h"
+#include "llpounceable.h"
#include <string>
@@ -165,7 +166,7 @@ LLFontGL* LLFontGL::getFontDefault()
char const* const _PREHASH_AgentData = (char *)"AgentData";
char const* const _PREHASH_AgentID = (char *)"AgentID";
-LLMessageSystem* gMessageSystem = NULL;
+LLPounceable<LLMessageSystem*, LLPounceableStatic> gMessageSystem;
//
// Stub implementation for LLMessageSystem
diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp
index 1cc0e819db..db0eac7031 100644
--- a/indra/llvfs/llvfs.cpp
+++ b/indra/llvfs/llvfs.cpp
@@ -2114,6 +2114,17 @@ void LLVFS::dumpFiles()
LL_INFOS() << "Extracted " << files_extracted << " files out of " << mFileBlocks.size() << LL_ENDL;
}
+time_t LLVFS::creationTime()
+{
+ llstat data_file_stat;
+ int errors = LLFile::stat(mDataFilename, &data_file_stat);
+ if (0 == errors)
+ {
+ return data_file_stat.st_ctime;
+ }
+ return 0;
+}
+
//============================================================================
// protected
//============================================================================
diff --git a/indra/llvfs/llvfs.h b/indra/llvfs/llvfs.h
index 39f31a221b..dca5ff4ad5 100644
--- a/indra/llvfs/llvfs.h
+++ b/indra/llvfs/llvfs.h
@@ -127,6 +127,7 @@ public:
void dumpStatistics();
void listFiles();
void dumpFiles();
+ time_t creationTime();
protected:
void removeFileBlock(LLVFSFileBlock *fileblock);
diff --git a/indra/llwindow/llwindowcallbacks.cpp b/indra/llwindow/llwindowcallbacks.cpp
index 474953d3a4..7e90ade423 100644
--- a/indra/llwindow/llwindowcallbacks.cpp
+++ b/indra/llwindow/llwindowcallbacks.cpp
@@ -175,9 +175,9 @@ BOOL LLWindowCallbacks::handleDeviceChange(LLWindow *window)
return FALSE;
}
-void LLWindowCallbacks::handleDPIChanged(LLWindow *window, F32 ui_scale_factor, S32 window_width, S32 window_height)
+BOOL LLWindowCallbacks::handleDPIChanged(LLWindow *window, F32 ui_scale_factor, S32 window_width, S32 window_height)
{
-
+ return FALSE;
}
void LLWindowCallbacks::handlePingWatchdog(LLWindow *window, const char * msg)
diff --git a/indra/llwindow/llwindowcallbacks.h b/indra/llwindow/llwindowcallbacks.h
index de789a71d9..47d5a18858 100644
--- a/indra/llwindow/llwindowcallbacks.h
+++ b/indra/llwindow/llwindowcallbacks.h
@@ -65,7 +65,7 @@ public:
virtual void handleDataCopy(LLWindow *window, S32 data_type, void *data);
virtual BOOL handleTimerEvent(LLWindow *window);
virtual BOOL handleDeviceChange(LLWindow *window);
- virtual void handleDPIChanged(LLWindow *window, F32 ui_scale_factor, S32 window_width, S32 window_height);
+ virtual BOOL handleDPIChanged(LLWindow *window, F32 ui_scale_factor, S32 window_width, S32 window_height);
enum DragNDropAction {
DNDA_START_TRACKING = 0,// Start tracking an incoming drag
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 4086db8e52..321792eb14 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -2623,19 +2623,21 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
case WM_DPICHANGED:
{
LPRECT lprc_new_scale;
- F32 new_scale = LOWORD(w_param) / USER_DEFAULT_SCREEN_DPI;
+ F32 new_scale = F32(LOWORD(w_param)) / F32(USER_DEFAULT_SCREEN_DPI);
lprc_new_scale = (LPRECT)l_param;
S32 new_width = lprc_new_scale->right - lprc_new_scale->left;
S32 new_height = lprc_new_scale->bottom - lprc_new_scale->top;
- window_imp->mCallbacks->handleDPIChanged(window_imp, new_scale, new_width, new_height);
- SetWindowPos(h_wnd,
- HWND_TOP,
- lprc_new_scale->left,
- lprc_new_scale->top,
- new_width,
- new_height,
- SWP_NOZORDER | SWP_NOACTIVATE);
- return 0;
+ if (window_imp->mCallbacks->handleDPIChanged(window_imp, new_scale, new_width, new_height))
+ {
+ SetWindowPos(h_wnd,
+ HWND_TOP,
+ lprc_new_scale->left,
+ lprc_new_scale->top,
+ new_width,
+ new_height,
+ SWP_NOZORDER | SWP_NOACTIVATE);
+ }
+ return 0;
}
case WM_SETFOCUS:
@@ -3982,7 +3984,7 @@ F32 LLWindowWin32::getSystemUISize()
hr = pGDFM(hMonitor, MDT_EFFECTIVE_DPI, &dpix, &dpiy);
if (hr == S_OK)
{
- scale_value = dpix / USER_DEFAULT_SCREEN_DPI;
+ scale_value = F32(dpix) / F32(USER_DEFAULT_SCREEN_DPI);
}
else
{
@@ -4001,7 +4003,7 @@ F32 LLWindowWin32::getSystemUISize()
else
{
LL_WARNS() << "Could not load shcore.dll library (included by <ShellScalingAPI.h> from Win 8.1 SDK). Using legacy DPI awareness API of Win XP/7" << LL_ENDL;
- scale_value = GetDeviceCaps(hdc, LOGPIXELSX) / USER_DEFAULT_SCREEN_DPI;
+ scale_value = F32(GetDeviceCaps(hdc, LOGPIXELSX)) / F32(USER_DEFAULT_SCREEN_DPI);
}
ReleaseDC(hWnd, hdc);
diff --git a/indra/media_plugins/cef/windows_volume_catcher.cpp b/indra/media_plugins/cef/windows_volume_catcher.cpp
index 0cfb810906..c9ea3ed597 100644
--- a/indra/media_plugins/cef/windows_volume_catcher.cpp
+++ b/indra/media_plugins/cef/windows_volume_catcher.cpp
@@ -31,17 +31,16 @@
#include "llsingleton.h"
class VolumeCatcherImpl : public LLSingleton<VolumeCatcherImpl>
{
-friend LLSingleton<VolumeCatcherImpl>;
+ LLSINGLETON(VolumeCatcherImpl);
+ // This is a singleton class -- both callers and the component implementation should use getInstance() to find the instance.
+ ~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);
diff --git a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp
index 0bd323eb58..ebcdde2960 100644
--- a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp
+++ b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp
@@ -84,6 +84,7 @@ private:
float mCurTime;
float mDuration;
+ EStatus mVlcStatus;
};
////////////////////////////////////////////////////////////////////////////////
@@ -111,6 +112,7 @@ MediaPluginBase(host_send_func, host_user_data)
mURL = std::string();
+ mVlcStatus = STATUS_NONE;
setStatus(STATUS_NONE);
}
@@ -209,28 +211,28 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)
switch (event->type)
{
case libvlc_MediaPlayerOpening:
- parent->setStatus(STATUS_LOADING);
+ parent->mVlcStatus = STATUS_LOADING;
break;
case libvlc_MediaPlayerPlaying:
parent->mDuration = (float)(libvlc_media_get_duration(parent->mLibVLCMedia)) / 1000.0f;
- parent->setStatus(STATUS_PLAYING);
+ parent->mVlcStatus = STATUS_PLAYING;
break;
case libvlc_MediaPlayerPaused:
- parent->setStatus(STATUS_PAUSED);
+ parent->mVlcStatus = STATUS_PAUSED;
break;
case libvlc_MediaPlayerStopped:
- parent->setStatus(STATUS_DONE);
+ parent->mVlcStatus = STATUS_DONE;
break;
case libvlc_MediaPlayerEndReached:
- parent->setStatus(STATUS_DONE);
+ parent->mVlcStatus = STATUS_DONE;
break;
case libvlc_MediaPlayerEncounteredError:
- parent->setStatus(STATUS_ERROR);
+ parent->mVlcStatus = STATUS_ERROR;
break;
case libvlc_MediaPlayerTimeChanged:
@@ -446,6 +448,7 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)
}
else if (message_name == "idle")
{
+ setStatus(mVlcStatus);
}
else if (message_name == "cleanup")
{
@@ -567,7 +570,7 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)
{
if (mLibVLCMediaPlayer)
{
- libvlc_media_player_pause(mLibVLCMediaPlayer);
+ libvlc_media_player_set_pause(mLibVLCMediaPlayer, 1);
}
}
else if (message_name == "seek")
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index d6d7d2c563..9ac1c3520d 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -248,7 +248,6 @@ set(viewer_SOURCE_FILES
llfloaterimsession.cpp
llfloaterimcontainer.cpp
llfloaterinspect.cpp
- llfloaterinventory.cpp
llfloaterjoystick.cpp
llfloaterlagmeter.cpp
llfloaterland.cpp
@@ -262,7 +261,8 @@ set(viewer_SOURCE_FILES
llfloatermodeluploadbase.cpp
llfloaternamedesc.cpp
llfloaternotificationsconsole.cpp
- llfloaternotificationstabbed.cpp
+ llfloaternotificationstabbed.cpp
+ llfloateroutfitphotopreview.cpp
llfloateroutfitsnapshot.cpp
llfloaterobjectweights.cpp
llfloateropenobject.cpp
@@ -867,7 +867,6 @@ set(viewer_HEADER_FILES
llfloaterimsession.h
llfloaterimcontainer.h
llfloaterinspect.h
- llfloaterinventory.h
llfloaterjoystick.h
llfloaterlagmeter.h
llfloaterland.h
@@ -881,7 +880,8 @@ set(viewer_HEADER_FILES
llfloatermodeluploadbase.h
llfloaternamedesc.h
llfloaternotificationsconsole.h
- llfloaternotificationstabbed.h
+ llfloaternotificationstabbed.h
+ llfloateroutfitphotopreview.h
llfloateroutfitsnapshot.h
llfloaterobjectweights.h
llfloateropenobject.h
diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml
index a0d3dc0f99..9bc0a7c701 100644
--- a/indra/newview/app_settings/commands.xml
+++ b/indra/newview/app_settings/commands.xml
@@ -282,4 +282,14 @@
is_running_function="Floater.IsOpen"
is_running_parameters="camera"
/>
+ <command name="reporter"
+ available_in_toybox="true"
+ icon="Command_Report_Abuse_Icon"
+ label_ref="Command_Report_Abuse_Label"
+ tooltip_ref="Command_Report_Abuse_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="reporter"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="reporter"
+ />
</commands>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 6621b9e269..717deba8c7 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1608,18 +1608,6 @@
<real>60.0</real>
</map>
- <key>CameraAspectRatio</key>
- <map>
- <key>Comment</key>
- <string>Camera aspect ratio for DoF effect</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>1.5</real>
- </map>
-
<key>CertStore</key>
<map>
<key>Comment</key>
@@ -5263,6 +5251,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>LastAppearanceTab</key>
+ <map>
+ <key>Comment</key>
+ <string>Last selected tab in appearance floater</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>LastMediaSettingsTab</key>
<map>
<key>Comment</key>
@@ -5377,7 +5376,7 @@
<key>LeftClickShowMenu</key>
<map>
<key>Comment</key>
- <string>Left click opens pie menu (FALSE = left click touches or grabs object)</string>
+ <string>Unused obsolete setting</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -6629,6 +6628,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>MuteListLimit</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of entries in the mute list</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>1000</integer>
+ </map>
<key>MyOutfitsAutofill</key>
<map>
<key>Comment</key>
@@ -11802,6 +11812,17 @@
<key>Value</key>
<integer>75</integer>
</map>
+ <key>AbuseReportScreenshotDelay</key>
+ <map>
+ <key>Comment</key>
+ <string>Time delay before taking screenshot to avoid UI artifacts.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.3</real>
+ </map>
<key>SpeedTest</key>
<map>
<key>Comment</key>
@@ -14722,6 +14743,7 @@
<string>snapshot</string>
<string>postcard</string>
<string>mini_map</string>
+ <string>beacons</string>
</array>
</map>
<key>LandmarksSortedByDate</key>
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index fd6b1b5b3f..92e61d2e86 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -242,6 +242,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>PreviousScreenshotForReport</key>
+ <map>
+ <key>Comment</key>
+ <string>Use Previous Screenshot for Abuse report</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</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
@@ -251,7 +262,7 @@
<key>LogChat</key>
<map>
<key>Comment</key>
- <string>Log Chat</string>
+ <string>Obsolete - this setting is no longer used and has no effect.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -262,7 +273,7 @@
<key>LogChatIM</key>
<map>
<key>Comment</key>
- <string>Log Incoming Instant Messages with Chat</string>
+ <string>Obsolete - this setting is no longer used and has no effect.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -273,7 +284,7 @@
<key>LogChatTimestamp</key>
<map>
<key>Comment</key>
- <string>Log Timestamp of Chat</string>
+ <string>Obsolete - this setting is no longer used and has no effect.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -281,6 +292,7 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <!-- End of back compatibility settings -->
<key>TranslatingEnabled</key>
<map>
<key>Comment</key>
@@ -336,6 +348,49 @@
<key>Value</key>
<integer>1</integer>
</map>
- <!-- End of back compatibility settings -->
+ <key>ModelUploadFolder</key>
+ <map>
+ <key>Comment</key>
+ <string>All model uploads will be stored in this directory (UUID)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string></string>
+ </map>
+ <key>TextureUploadFolder</key>
+ <map>
+ <key>Comment</key>
+ <string>All image(texture) uploads will be stored in this directory (UUID)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string></string>
+ </map>
+ <key>SoundUploadFolder</key>
+ <map>
+ <key>Comment</key>
+ <string>All sound uploads will be stored in this directory (UUID)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string></string>
+ </map>
+ <key>AnimationUploadFolder</key>
+ <map>
+ <key>Comment</key>
+ <string>All animation uploads will be stored in this directory (UUID)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string></string>
+ </map>
</map>
</llsd>
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl
index b9ddbc8e1c..8918182853 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl
@@ -43,12 +43,12 @@ void default_lighting()
{
vec4 color = texture2D(diffuseMap,vary_texcoord0.xy);
+ color *= vertex_color;
+
if (color.a < minimum_alpha)
{
discard;
}
-
- color.rgb *= vertex_color.rgb;
color.rgb = atmosLighting(color.rgb);
diff --git a/indra/newview/llaccountingcostmanager.h b/indra/newview/llaccountingcostmanager.h
index f251ceffd4..55e1d19f05 100644
--- a/indra/newview/llaccountingcostmanager.h
+++ b/indra/newview/llaccountingcostmanager.h
@@ -58,9 +58,9 @@ protected:
//===============================================================================
class LLAccountingCostManager : public LLSingleton<LLAccountingCostManager>
{
+ LLSINGLETON(LLAccountingCostManager);
+
public:
- //Ctor
- LLAccountingCostManager();
//Store an object that will be eventually fetched
void addObject( const LLUUID& objectID );
//Request quotas for object list
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 66e2d6fa6a..7d0d39e22a 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -2050,7 +2050,10 @@ void LLAgent::endAnimationUpdateUI()
{
skip_list.insert(LLFloaterReg::findInstance("mini_map"));
}
-
+ if (LLFloaterReg::findInstance("beacons"))
+ {
+ skip_list.insert(LLFloaterReg::findInstance("beacons"));
+ }
LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
LLFloaterIMContainer::floater_list_t conversations;
im_box->getDetachedConversationFloaters(conversations);
@@ -2172,6 +2175,7 @@ void LLAgent::endAnimationUpdateUI()
#else // Use this for now
LLFloaterView::skip_list_t skip_list;
skip_list.insert(LLFloaterReg::findInstance("mini_map"));
+ skip_list.insert(LLFloaterReg::findInstance("beacons"));
gFloaterView->pushVisibleAll(FALSE, skip_list);
#endif
@@ -3191,7 +3195,7 @@ void LLAgent::initOriginGlobal(const LLVector3d &origin_global)
}
BOOL LLAgent::leftButtonGrabbed() const
-{
+{
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)
@@ -3199,13 +3203,6 @@ BOOL LLAgent::leftButtonGrabbed() const
|| (camera_mouse_look && mControlsTakenPassedOnCount[CONTROL_ML_LBUTTON_DOWN_INDEX] > 0);
}
-BOOL LLAgent::leftButtonBlocked() const
-{
- 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);
-}
-
BOOL LLAgent::rotateGrabbed() const
{
return (mControlsTakenCount[CONTROL_YAW_POS_INDEX] > 0)
@@ -3663,14 +3660,7 @@ BOOL LLAgent::anyControlGrabbed() const
BOOL LLAgent::isControlGrabbed(S32 control_index) const
{
- if (gAgent.mControlsTakenCount[control_index] > 0)
- return TRUE;
- return gAgent.mControlsTakenPassedOnCount[control_index] > 0;
-}
-
-BOOL LLAgent::isControlBlocked(S32 control_index) const
-{
- return mControlsTakenCount[control_index] > 0;
+ return mControlsTakenCount[control_index] > 0;
}
void LLAgent::forceReleaseControls()
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index d82ff7a67f..b5da5e9062 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -444,8 +444,7 @@ private:
// Grab
//--------------------------------------------------------------------
public:
- BOOL leftButtonGrabbed() const;
- BOOL leftButtonBlocked() const;
+ BOOL leftButtonGrabbed() const;
BOOL rotateGrabbed() const;
BOOL forwardGrabbed() const;
BOOL backwardGrabbed() const;
@@ -462,9 +461,8 @@ public:
BOOL controlFlagsDirty() const;
void enableControlFlagReset();
void resetControlFlags();
- BOOL anyControlGrabbed() const; // True if a script has taken over any control
- BOOL isControlGrabbed(S32 control_index) const; // True if a script has taken over a control
- BOOL isControlBlocked(S32 control_index) const; // Control should be ignored or won't be passed
+ BOOL anyControlGrabbed() const; // True iff a script has taken over a control
+ BOOL isControlGrabbed(S32 control_index) const;
// Send message to simulator to force grabbed controls to be
// released, in case of a poorly written script.
void forceReleaseControls();
diff --git a/indra/newview/llagentpicksinfo.h b/indra/newview/llagentpicksinfo.h
index abf7027ed2..f981e08ff7 100644
--- a/indra/newview/llagentpicksinfo.h
+++ b/indra/newview/llagentpicksinfo.h
@@ -36,14 +36,12 @@ struct LLAvatarPicks;
*/
class LLAgentPicksInfo : public LLSingleton<LLAgentPicksInfo>
{
+ LLSINGLETON(LLAgentPicksInfo);
+ virtual ~LLAgentPicksInfo();
+
class LLAgentPicksObserver;
public:
-
- LLAgentPicksInfo();
-
- virtual ~LLAgentPicksInfo();
-
/**
* Requests number of picks from server.
*
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index b27698fd8f..2710262910 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -38,6 +38,7 @@
#include "llviewerinventory.h"
#include "llavatarappearancedefines.h"
#include "llwearabledata.h"
+#include "llinitdestroyclass.h"
class LLInventoryItem;
class LLVOAvatarSelf;
diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm
index be8877328d..8188c6c3f9 100644
--- a/indra/newview/llappdelegate-objc.mm
+++ b/indra/newview/llappdelegate-objc.mm
@@ -58,7 +58,7 @@
frameTimer = [NSTimer scheduledTimerWithTimeInterval:0.0 target:self
selector:@selector(oneFrame) userInfo:nil repeats:YES];
} else {
- handleQuit();
+ exit(0);
}
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(languageUpdated) name:@"NSTextInputContextKeyboardSelectionDidChangeNotification" object:nil];
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 4d6d7a9d89..046e829070 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -1227,11 +1227,12 @@ void LLWearableHoldingPattern::onWearableAssetFetch(LLViewerWearable *wearable)
return;
}
+ U32 use_count = 0;
for (LLWearableHoldingPattern::found_list_t::iterator iter = getFoundList().begin();
- iter != getFoundList().end(); ++iter)
+ iter != getFoundList().end(); ++iter)
{
LLFoundData& data = *iter;
- if(wearable->getAssetID() == data.mAssetID)
+ if (wearable->getAssetID() == data.mAssetID)
{
// Failing this means inventory or asset server are corrupted in a way we don't handle.
if ((data.mWearableType >= LLWearableType::WT_COUNT) || (wearable->getType() != data.mWearableType))
@@ -1240,9 +1241,45 @@ void LLWearableHoldingPattern::onWearableAssetFetch(LLViewerWearable *wearable)
break;
}
- data.mWearable = wearable;
+ if (use_count == 0)
+ {
+ data.mWearable = wearable;
+ use_count++;
+ }
+ else if (wearable->getPermissions().allowModifyBy(gAgent.getID()))
+ {
+ // We can't edit and do some other interactions with same asset twice, copy it
+ LLViewerWearable* new_wearable = LLWearableList::instance().createCopy(wearable, wearable->getName());
+ data.mWearable = new_wearable;
+ data.mAssetID = new_wearable->getAssetID();
+
+ LLViewerInventoryItem* item = gInventory.getItem(data.mItemID);
+ if (item)
+ {
+ // Update existing inventory item
+ item->setAssetUUID(new_wearable->getAssetID());
+ item->setTransactionID(new_wearable->getTransactionID());
+ gInventory.updateItem(item, LLInventoryObserver::INTERNAL);
+ item->updateServer(FALSE);
+ }
+ use_count++;
+ }
+ else
+ {
+ // Note: technically a bug, LLViewerWearable can identify only one item id at a time,
+ // yet we are tying it to multiple items here.
+ // LLViewerWearable need to support more then one item.
+ LL_WARNS() << "Same LLViewerWearable is used by multiple items! " << wearable->getAssetID() << LL_ENDL;
+ data.mWearable = wearable;
+ }
}
}
+
+ if (use_count > 1)
+ {
+ LL_WARNS() << "Copying wearable, multiple asset id uses! " << wearable->getAssetID() << LL_ENDL;
+ gInventory.notifyObservers();
+ }
}
static void onWearableAssetFetch(LLViewerWearable* wearable, void* data)
@@ -3410,9 +3447,21 @@ LLSD LLAppearanceMgr::dumpCOF() const
return result;
}
+// static
+void LLAppearanceMgr::onIdle(void *)
+{
+ LLAppearanceMgr* mgr = LLAppearanceMgr::getInstance();
+ if (mgr->mRerequestAppearanceBake)
+ {
+ mgr->requestServerAppearanceUpdate();
+ }
+}
+
void LLAppearanceMgr::requestServerAppearanceUpdate()
{
- if (!mOutstandingAppearanceBakeRequest)
+ // Workaround: we shouldn't request update from server prior to uploading all attachments, but it is
+ // complicated to check for pending attachment uploads, so we are just waiting for uploads to complete
+ if (!mOutstandingAppearanceBakeRequest && gAssetStorage->getNumPendingUploads() == 0)
{
mRerequestAppearanceBake = false;
LLCoprocedureManager::CoProcedure_t proc = boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this, _1);
@@ -3420,13 +3469,14 @@ void LLAppearanceMgr::requestServerAppearanceUpdate()
}
else
{
+ // Shedule update
mRerequestAppearanceBake = true;
}
}
void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter)
{
- mRerequestAppearanceBake = false;
+ BoolSetter outstanding(mOutstandingAppearanceBakeRequest);
if (!gAgent.getRegion())
{
LL_WARNS("Avatar") << "Region not set, cannot request server appearance update" << LL_ENDL;
@@ -3458,8 +3508,6 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
bool bRetry;
do
{
- BoolSetter outstanding(mOutstandingAppearanceBakeRequest);
-
// If we have already received an update for this or higher cof version,
// put a warning in the log and cancel the request.
S32 cofVersion = getCOFVersion();
@@ -3571,12 +3619,6 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
}
} while (bRetry);
-
- if (mRerequestAppearanceBake)
- { // A bake request came in while this one was still outstanding.
- // Requeue ourself for a later request.
- requestServerAppearanceUpdate();
- }
}
/*static*/
@@ -3942,7 +3984,6 @@ LLAppearanceMgr::LLAppearanceMgr():
mAttachmentInvLinkEnabled(false),
mOutfitIsDirty(false),
mOutfitLocked(false),
- mInFlightCounter(0),
mInFlightTimer(),
mIsInUpdateAppearanceFromCOF(false),
mOutstandingAppearanceBakeRequest(false),
@@ -3957,6 +3998,7 @@ LLAppearanceMgr::LLAppearanceMgr():
"OutfitOperationsTimeout")));
gIdleCallbacks.addFunction(&LLAttachmentsMgr::onIdle, NULL);
+ gIdleCallbacks.addFunction(&LLAppearanceMgr::onIdle, NULL); //sheduling appearance update requests
}
LLAppearanceMgr::~LLAppearanceMgr()
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index f0d3f80f59..166c663feb 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -42,9 +42,10 @@ class LLOutfitUnLockTimer;
class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr>
{
+ LLSINGLETON(LLAppearanceMgr);
+ ~LLAppearanceMgr();
LOG_CLASS(LLAppearanceMgr);
- friend class LLSingleton<LLAppearanceMgr>;
friend class LLOutfitUnLockTimer;
public:
@@ -224,6 +225,7 @@ public:
bool isInUpdateAppearanceFromCOF() { return mIsInUpdateAppearanceFromCOF; }
+ static void onIdle(void *);
void requestServerAppearanceUpdate();
void setAppearanceServiceURL(const std::string& url) { mAppearanceServiceURL = url; }
@@ -234,17 +236,12 @@ public:
boost::signals2::connection setAttachmentsChangedCallback(attachments_changed_callback_t cb);
-
private:
void serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter);
static void debugAppearanceUpdateCOF(const LLSD& content);
std::string mAppearanceServiceURL;
-
-protected:
- LLAppearanceMgr();
- ~LLAppearanceMgr();
private:
@@ -272,7 +269,6 @@ private:
* to avoid unsynchronized outfit state or performing duplicate operations.
*/
bool mOutfitLocked;
- S32 mInFlightCounter;
LLTimer mInFlightTimer;
static bool mActive;
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index e178bbb21a..5eb82a2d0b 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -209,7 +209,7 @@
#include "llfloaterreg.h"
#include "llfloateroutfitsnapshot.h"
#include "llfloatersnapshot.h"
-#include "llfloaterinventory.h"
+#include "llsidepanelinventory.h"
// includes for idle() idleShutdown()
#include "llviewercontrol.h"
@@ -234,6 +234,7 @@
#include "llsecapi.h"
#include "llmachineid.h"
#include "llmainlooprepeater.h"
+#include "llcleanup.h"
#include "llcoproceduremanager.h"
#include "llviewereventrecorder.h"
@@ -388,6 +389,7 @@ const char* const VIEWER_WINDOW_CLASSNAME = "Second Life";
*/
class LLDeferredTaskList: public LLSingleton<LLDeferredTaskList>
{
+ LLSINGLETON_EMPTY_CTOR(LLDeferredTaskList);
LOG_CLASS(LLDeferredTaskList);
friend class LLAppViewer;
@@ -738,7 +740,7 @@ LLAppViewer::LLAppViewer()
LLAppViewer::~LLAppViewer()
{
delete mSettingsLocationList;
- LLViewerEventRecorder::instance().~LLViewerEventRecorder();
+ LLViewerEventRecorder::deleteSingleton();
LLLoginInstance::instance().setUpdaterService(0);
@@ -1233,7 +1235,8 @@ bool LLAppViewer::init()
boost::bind(&LLControlGroup::getU32, boost::ref(gSavedSettings), _1),
boost::bind(&LLControlGroup::declareU32, boost::ref(gSavedSettings), _1, _2, _3, LLControlVariable::PERSIST_ALWAYS));
- showReleaseNotesIfRequired();
+ // TODO: consider moving proxy initialization here or LLCopocedureManager after proxy initialization, may be implement
+ // some other protection to make sure we don't use network before initializng proxy
/*----------------------------------------------------------------------*/
// nat 2016-06-29 moved the following here from the former mainLoop().
@@ -1741,7 +1744,7 @@ bool LLAppViewer::cleanup()
gTransferManager.cleanup();
#endif
- LLLocalBitmapMgr::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLLocalBitmapMgr);
// Note: this is where gWorldMap used to be deleted.
@@ -1850,11 +1853,11 @@ bool LLAppViewer::cleanup()
LLViewerObject::cleanupVOClasses();
- LLAvatarAppearance::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLAvatarAppearance);
- LLAvatarAppearance::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLAvatarAppearance);
- LLPostProcess::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLPostProcess);
LLTracker::cleanupInstance();
@@ -1880,12 +1883,12 @@ bool LLAppViewer::cleanup()
//end_messaging_system();
- LLFollowCamMgr::cleanupClass();
- //LLVolumeMgr::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLFollowCamMgr);
+ //SUBSYSTEM_CLEANUP(LLVolumeMgr);
LLPrimitive::cleanupVolumeManager();
- LLWorldMapView::cleanupClass();
- LLFolderViewItem::cleanupClass();
- LLUI::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLWorldMapView);
+ SUBSYSTEM_CLEANUP(LLFolderViewItem);
+ SUBSYSTEM_CLEANUP(LLUI);
//
// Shut down the VFS's AFTER the decode manager cleans up (since it cleans up vfiles).
@@ -1894,7 +1897,7 @@ bool LLAppViewer::cleanup()
//
LL_INFOS() << "Cleaning up VFS" << LL_ENDL;
- LLVFile::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLVFile);
LL_INFOS() << "Saving Data" << LL_ENDL;
@@ -1997,9 +2000,9 @@ bool LLAppViewer::cleanup()
// Non-LLCurl libcurl library
mAppCoreHttp.cleanup();
- LLFilePickerThread::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLFilePickerThread);
- //MUST happen AFTER LLCurl::cleanupClass
+ //MUST happen AFTER SUBSYSTEM_CLEANUP(LLCurl)
delete sTextureCache;
sTextureCache = NULL;
delete sTextureFetch;
@@ -2023,22 +2026,22 @@ bool LLAppViewer::cleanup()
gDirUtilp->getExpandedFilename(LL_PATH_LOGS, report_name));
}
- LLMetricPerformanceTesterBasic::cleanClass() ;
+ SUBSYSTEM_CLEANUP(LLMetricPerformanceTesterBasic) ;
LL_INFOS() << "Cleaning up Media and Textures" << LL_ENDL;
//Note:
- //LLViewerMedia::cleanupClass() has to be put before gTextureList.shutdown()
+ //SUBSYSTEM_CLEANUP(LLViewerMedia) has to be put before gTextureList.shutdown()
//because some new image might be generated during cleaning up media. --bao
- LLViewerMedia::cleanupClass();
- LLViewerParcelMedia::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLViewerMedia);
+ SUBSYSTEM_CLEANUP(LLViewerParcelMedia);
gTextureList.shutdown(); // shutdown again in case a callback added something
LLUIImageList::getInstance()->cleanUp();
// This should eventually be done in LLAppViewer
- LLImage::cleanupClass();
- LLVFSThread::cleanupClass();
- LLLFSThread::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLImage);
+ SUBSYSTEM_CLEANUP(LLVFSThread);
+ SUBSYSTEM_CLEANUP(LLLFSThread);
#ifndef LL_RELEASE_FOR_DOWNLOAD
LL_INFOS() << "Auditing VFS" << LL_ENDL;
@@ -2081,10 +2084,10 @@ bool LLAppViewer::cleanup()
LL_INFOS() << "File launched." << LL_ENDL;
}
LL_INFOS() << "Cleaning up LLProxy." << LL_ENDL;
- LLProxy::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLProxy);
LLCore::LLHttp::cleanup();
- LLWearableType::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLWearableType);
LLMainLoopRepeater::instance().stop();
@@ -2096,10 +2099,34 @@ bool LLAppViewer::cleanup()
LLError::LLCallStacks::cleanup();
removeMarkerFiles();
-
- LL_INFOS() << "Goodbye!" << LL_ENDL;
- removeDumpDir();
+ // It's not at first obvious where, in this long sequence, generic cleanup
+ // calls OUGHT to go. So let's say this: as we migrate cleanup from
+ // explicit hand-placed calls into the generic mechanism, eventually
+ // all cleanup will get subsumed into the generic calls. So the calls you
+ // still see above are calls that MUST happen before the generic cleanup
+ // kicks in.
+
+ // This calls every remaining LLSingleton's cleanupSingleton() method.
+ // This method should perform any cleanup that might take significant
+ // realtime, or might throw an exception.
+ LLSingletonBase::cleanupAll();
+
+ // This calls every remaining LLSingleton's deleteSingleton() method.
+ // No class destructor should perform any cleanup that might take
+ // significant realtime, or throw an exception.
+ // LLSingleton machinery includes a last-gasp implicit deleteAll() call,
+ // so this explicit call shouldn't strictly be necessary. However, by the
+ // time the runtime engages that implicit call, it may already have
+ // destroyed things like std::cerr -- so the implicit deleteAll() refrains
+ // from logging anything. Since both cleanupAll() and deleteAll() call
+ // their respective cleanup methods in computed dependency order, it's
+ // probably useful to be able to log that order.
+ LLSingletonBase::deleteAll();
+
+ LL_INFOS() << "Goodbye!" << LL_ENDL;
+
+ removeDumpDir();
// return 0;
return true;
@@ -3324,6 +3351,26 @@ LLSD LLAppViewer::getViewerInfo() const
info["OPENGL_VERSION"] = (const char*)(glGetString(GL_VERSION));
+ // Settings
+
+ LLRect window_rect = gViewerWindow->getWindowRectRaw();
+ info["WINDOW_WIDTH"] = window_rect.getWidth();
+ info["WINDOW_HEIGHT"] = window_rect.getHeight();
+ info["FONT_SIZE_ADJUSTMENT"] = gSavedSettings.getF32("FontScreenDPI");
+ info["UI_SCALE"] = gSavedSettings.getF32("UIScaleFactor");
+ info["DRAW_DISTANCE"] = gSavedSettings.getF32("RenderFarClip");
+ info["NET_BANDWITH"] = gSavedSettings.getF32("ThrottleBandwidthKBPS");
+ info["LOD_FACTOR"] = gSavedSettings.getF32("RenderVolumeLODFactor");
+ info["RENDER_QUALITY"] = (F32)gSavedSettings.getU32("RenderQualityPerformance");
+ info["GPU_SHADERS"] = gSavedSettings.getBOOL("RenderDeferred") ? "Enabled" : "Disabled";
+ info["TEXTURE_MEMORY"] = gSavedSettings.getS32("TextureMemory");
+
+ LLSD substitution;
+ substitution["datetime"] = (S32)(gVFS ? gVFS->creationTime() : 0);
+ info["VFS_TIME"] = LLTrans::getString("AboutTime", substitution);
+
+ // Libraries
+
info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();
bool want_fullname = true;
info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD();
@@ -3443,7 +3490,9 @@ std::string LLAppViewer::getViewerInfoString() const
{
support << "\n" << LLTrans::getString("AboutDriver", args);
}
- support << "\n" << LLTrans::getString("AboutLibs", args);
+ support << "\n" << LLTrans::getString("AboutOGL", args);
+ support << "\n\n" << LLTrans::getString("AboutSettings", args);
+ support << "\n\n" << LLTrans::getString("AboutLibs", args);
if (info.has("COMPILER"))
{
support << "\n" << LLTrans::getString("AboutCompiler", args);
@@ -5494,12 +5543,15 @@ void LLAppViewer::disconnectViewer()
}
saveNameCache();
- LLExperienceCache *expCache = LLExperienceCache::getIfExists();
- if (expCache)
- expCache->cleanup();
+ if (LLExperienceCache::instanceExists())
+ {
+ // TODO: LLExperienceCache::cleanup() logic should be moved to
+ // cleanupSingleton().
+ LLExperienceCache::instance().cleanup();
+ }
// close inventory interface, close all windows
- LLFloaterInventory::cleanup();
+ LLSidepanelInventory::cleanup();
gAgentWearables.cleanup();
gAgentCamera.cleanup();
@@ -5812,21 +5864,6 @@ void LLAppViewer::launchUpdater()
// LLAppViewer::instance()->forceQuit();
}
-/**
-* Check if user is running a new version of the viewer.
-* Display the Release Notes if it's not overriden by the "UpdaterShowReleaseNotes" setting.
-*/
-void LLAppViewer::showReleaseNotesIfRequired()
-{
- if (LLVersionInfo::getChannelAndVersion() != gLastRunVersion
- && gSavedSettings.getBOOL("UpdaterShowReleaseNotes")
- && !gSavedSettings.getBOOL("FirstLoginThisInstall"))
- {
- LLSD info(getViewerInfo());
- LLWeb::loadURLInternal(info["VIEWER_RELEASE_NOTES_URL"]);
- }
-}
-
//virtual
void LLAppViewer::setMasterSystemAudioMute(bool mute)
{
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 948d316009..7bb3c32c51 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -255,8 +255,6 @@ private:
void sendLogoutRequest();
void disconnectViewer();
- void showReleaseNotesIfRequired();
-
// *FIX: the app viewer class should be some sort of singleton, no?
// Perhaps its child class is the singleton and this should be an abstract base.
static LLAppViewer* sInstance;
diff --git a/indra/newview/llattachmentsmgr.h b/indra/newview/llattachmentsmgr.h
index bb7d35edbc..a4ef762e8b 100644
--- a/indra/newview/llattachmentsmgr.h
+++ b/indra/newview/llattachmentsmgr.h
@@ -62,6 +62,9 @@ class LLViewerInventoryItem;
//--------------------------------------------------------------------------------
class LLAttachmentsMgr: public LLSingleton<LLAttachmentsMgr>
{
+ LLSINGLETON(LLAttachmentsMgr);
+ virtual ~LLAttachmentsMgr();
+
public:
// Stores info for attachments that will be requested during idle.
struct AttachmentsInfo
@@ -72,9 +75,6 @@ public:
};
typedef std::deque<AttachmentsInfo> attachments_vec_t;
- LLAttachmentsMgr();
- virtual ~LLAttachmentsMgr();
-
void addAttachmentRequest(const LLUUID& item_id,
const U8 attachment_pt,
const BOOL add);
diff --git a/indra/newview/llautoreplace.h b/indra/newview/llautoreplace.h
index 9eecc2d981..23cc313646 100644
--- a/indra/newview/llautoreplace.h
+++ b/indra/newview/llautoreplace.h
@@ -191,6 +191,7 @@ class LLAutoReplaceSettings
*/
class LLAutoReplace : public LLSingleton<LLAutoReplace>
{
+ LLSINGLETON(LLAutoReplace);
public:
/// Callback that provides the hook for use in text entry methods
void autoreplaceCallback(S32& replacement_start, S32& replacement_length, LLWString& replacement_string, S32& cursor_pos, const LLWString& input_text);
@@ -202,8 +203,6 @@ public:
void setSettings(const LLAutoReplaceSettings& settings);
private:
- friend class LLSingleton<LLAutoReplace>;
- LLAutoReplace();
/*virtual*/ void initSingleton();
LLAutoReplaceSettings mSettings; ///< configuration information
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 7b8c630837..36e95c07f4 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -689,6 +689,8 @@ namespace action_give_inventory
struct LLShareInfo : public LLSingleton<LLShareInfo>
{
+ LLSINGLETON_EMPTY_CTOR(LLShareInfo);
+ public:
std::vector<LLAvatarName> mAvatarNames;
uuid_vec_t mAvatarUuids;
};
diff --git a/indra/newview/llavatariconctrl.h b/indra/newview/llavatariconctrl.h
index 5b5720f4ac..a1dacd1a27 100644
--- a/indra/newview/llavatariconctrl.h
+++ b/indra/newview/llavatariconctrl.h
@@ -37,6 +37,8 @@ class LLAvatarName;
class LLAvatarIconIDCache: public LLSingleton<LLAvatarIconIDCache>
{
+ LLSINGLETON(LLAvatarIconIDCache);
+
public:
struct LLAvatarIconIDCacheItem
{
@@ -46,10 +48,6 @@ public:
bool expired();
};
- LLAvatarIconIDCache()
- : mFilename("avatar_icons_cache.txt")
- {}
-
void load ();
void save ();
@@ -64,6 +62,11 @@ protected:
std::map<LLUUID,LLAvatarIconIDCacheItem> mCache;//we cache only LLUID and time
};
+inline
+LLAvatarIconIDCache::LLAvatarIconIDCache()
+ : mFilename("avatar_icons_cache.txt")
+{}
+
namespace LLAvatarIconCtrlEnums
{
enum ESymbolPos
diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h
index 1dcd2c9b90..d5c5c75c69 100644
--- a/indra/newview/llavatarpropertiesprocessor.h
+++ b/indra/newview/llavatarpropertiesprocessor.h
@@ -187,13 +187,12 @@ public:
class LLAvatarPropertiesProcessor
: public LLSingleton<LLAvatarPropertiesProcessor>
{
-public:
-
- LLAvatarPropertiesProcessor();
+ LLSINGLETON(LLAvatarPropertiesProcessor);
virtual ~LLAvatarPropertiesProcessor();
+public:
void addObserver(const LLUUID& avatar_id, LLAvatarPropertiesObserver* observer);
-
+
void removeObserver(const LLUUID& avatar_id, LLAvatarPropertiesObserver* observer);
// Request various types of avatar data. Duplicate requests will be
diff --git a/indra/newview/llavatarrenderinfoaccountant.h b/indra/newview/llavatarrenderinfoaccountant.h
index 870ef4f394..6b5fa7bc35 100644
--- a/indra/newview/llavatarrenderinfoaccountant.h
+++ b/indra/newview/llavatarrenderinfoaccountant.h
@@ -38,13 +38,13 @@ class LLViewerRegion;
// that is sent to or fetched from regions.
class LLAvatarRenderInfoAccountant : public LLSingleton<LLAvatarRenderInfoAccountant>
{
+ LLSINGLETON(LLAvatarRenderInfoAccountant);
+ ~LLAvatarRenderInfoAccountant();
+
private:
LOG_CLASS(LLAvatarRenderInfoAccountant);
public:
- LLAvatarRenderInfoAccountant();
- ~LLAvatarRenderInfoAccountant();
-
void sendRenderInfoToRegion(LLViewerRegion * regionp);
void getRenderInfoFromRegion(LLViewerRegion * regionp);
diff --git a/indra/newview/llavatarrendernotifier.h b/indra/newview/llavatarrendernotifier.h
index a169baef40..ec17b3d9e6 100644
--- a/indra/newview/llavatarrendernotifier.h
+++ b/indra/newview/llavatarrendernotifier.h
@@ -67,9 +67,9 @@ typedef std::list<LLHUDComplexity> hud_complexity_list_t;
// reported that user's agent is too 'heavy' for their settings
class LLAvatarRenderNotifier : public LLSingleton<LLAvatarRenderNotifier>
{
-public:
- LLAvatarRenderNotifier();
+ LLSINGLETON(LLAvatarRenderNotifier);
+public:
void displayNotification(bool show_over_limit);
bool isNotificationVisible();
@@ -114,10 +114,10 @@ private:
// Class to notify user about heavy set of HUD
class LLHUDRenderNotifier : public LLSingleton<LLHUDRenderNotifier>
{
-public:
- LLHUDRenderNotifier();
+ LLSINGLETON(LLHUDRenderNotifier);
~LLHUDRenderNotifier();
+public:
void updateNotificationHUD(hud_complexity_list_t complexity);
bool isNotificationVisible();
diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h
index a5de8a5327..8b9d0dda8b 100644
--- a/indra/newview/llchannelmanager.h
+++ b/indra/newview/llchannelmanager.h
@@ -43,6 +43,9 @@ namespace LLNotificationsUI
*/
class LLChannelManager : public LLSingleton<LLChannelManager>
{
+ LLSINGLETON(LLChannelManager);
+ virtual ~LLChannelManager();
+
public:
@@ -65,9 +68,6 @@ public:
}
};
- LLChannelManager();
- virtual ~LLChannelManager();
-
// On LoginCompleted - show StartUp toast
void onLoginCompleted();
// removes a channel intended for the startup toast and allows other channels to show their toasts
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index cfc62c07b6..f5721fb348 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -240,6 +240,32 @@ void LLFloaterIMNearbyChatToastPanel::init(LLSD& notification)
}
}
+ S32 chars_in_line = mMsgText->getRect().getWidth() / messageFont->getWidth("c");
+ S32 max_lines = notification["available_height"].asInteger() / (mMsgText->getTextPixelHeight() + 4);
+ S32 new_line_chars = std::count(messageText.begin(), messageText.end(), '\n');
+ S32 lines_count = (messageText.size() - new_line_chars) / chars_in_line + new_line_chars + 1;
+
+ //Remove excessive chars if message is not fit in available height. MAINT-6891
+ if(lines_count > max_lines)
+ {
+ while(lines_count > max_lines)
+ {
+ std::size_t nl_pos = messageText.rfind('\n');
+ if (nl_pos != std::string::npos)
+ {
+ nl_pos = nl_pos > messageText.length() - chars_in_line? nl_pos : messageText.length() - chars_in_line;
+ messageText.erase(messageText.begin() + nl_pos, messageText.end());
+ }
+ else
+ {
+ messageText.erase(messageText.end() - chars_in_line, messageText.end());
+ }
+ new_line_chars = std::count(messageText.begin(), messageText.end(), '\n');
+ lines_count = (messageText.size() - new_line_chars) / chars_in_line + new_line_chars;
+ }
+ messageText += " ...";
+ }
+
//append text
{
LLStyle::Params style_params;
diff --git a/indra/newview/llchicletbar.cpp b/indra/newview/llchicletbar.cpp
index 254e3f61a8..c4f959bfa9 100644
--- a/indra/newview/llchicletbar.cpp
+++ b/indra/newview/llchicletbar.cpp
@@ -38,7 +38,7 @@ namespace
const std::string& PANEL_CHICLET_NAME = "chiclet_list_panel";
}
-LLChicletBar::LLChicletBar(const LLSD&)
+LLChicletBar::LLChicletBar()
: mChicletPanel(NULL),
mToolbarStack(NULL)
{
diff --git a/indra/newview/llchicletbar.h b/indra/newview/llchicletbar.h
index 956c82cb77..6c521dc1d5 100644
--- a/indra/newview/llchicletbar.h
+++ b/indra/newview/llchicletbar.h
@@ -38,8 +38,9 @@ class LLChicletBar
: public LLSingleton<LLChicletBar>
, public LLPanel
{
+ LLSINGLETON(LLChicletBar);
LOG_CLASS(LLChicletBar);
- friend class LLSingleton<LLChicletBar>;
+
public:
BOOL postBuild();
@@ -82,8 +83,6 @@ private:
void fitWithTopInfoBar();
protected:
- LLChicletBar(const LLSD& key = LLSD());
-
LLChicletPanel* mChicletPanel;
LLLayoutStack* mToolbarStack;
};
diff --git a/indra/newview/llconversationlog.h b/indra/newview/llconversationlog.h
index 62f08144b9..035cbcb945 100644
--- a/indra/newview/llconversationlog.h
+++ b/indra/newview/llconversationlog.h
@@ -109,7 +109,7 @@ private:
class LLConversationLog : public LLSingleton<LLConversationLog>, LLIMSessionObserver
{
- friend class LLSingleton<LLConversationLog>;
+ LLSINGLETON(LLConversationLog);
public:
void removeConversation(const LLConversation& conversation);
@@ -157,7 +157,6 @@ public:
private:
- LLConversationLog();
virtual ~LLConversationLog()
{
if (mAvatarNameCacheConnection.connected())
diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp
index b18e543f0a..15a8aacd37 100644
--- a/indra/newview/llconversationview.cpp
+++ b/indra/newview/llconversationview.cpp
@@ -303,7 +303,7 @@ BOOL LLConversationViewSession::handleMouseUp( S32 x, S32 y, MASK mask )
LLConversationItem* item = dynamic_cast<LLConversationItem *>(getViewModelItem());
LLUUID session_id = item? item->getUUID() : LLUUID();
LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id);
- if(!session_floater->hasFocus())
+ if(session_floater && !session_floater->hasFocus())
{
session_floater->setFocus(true);
}
@@ -458,6 +458,11 @@ void LLConversationViewSession::refresh()
}
}
}
+
+ if (mSpeakingIndicator)
+ {
+ mSpeakingIndicator->setShowParticipantsSpeaking(mIsInActiveVoiceChannel);
+ }
requestArrange();
// Do the regular upstream refresh
LLFolderViewFolder::refresh();
diff --git a/indra/newview/lldaycyclemanager.h b/indra/newview/lldaycyclemanager.h
index 3d2144960d..04db9d5dac 100644
--- a/indra/newview/lldaycyclemanager.h
+++ b/indra/newview/lldaycyclemanager.h
@@ -40,6 +40,7 @@
*/
class LLDayCycleManager : public LLSingleton<LLDayCycleManager>
{
+ LLSINGLETON_EMPTY_CTOR(LLDayCycleManager);
LOG_CLASS(LLDayCycleManager);
public:
@@ -66,7 +67,6 @@ public:
boost::signals2::connection setModifyCallback(const modify_signal_t::slot_type& cb);
private:
- friend class LLSingleton<LLDayCycleManager>;
/*virtual*/ void initSingleton();
void loadAllPresets();
diff --git a/indra/newview/lldeferredsounds.h b/indra/newview/lldeferredsounds.h
index bf1eb62957..33f02b3521 100644
--- a/indra/newview/lldeferredsounds.h
+++ b/indra/newview/lldeferredsounds.h
@@ -33,7 +33,7 @@ struct SoundData;
class LLDeferredSounds : public LLSingleton<LLDeferredSounds>
{
-private:
+ LLSINGLETON_EMPTY_CTOR(LLDeferredSounds);
std::vector<SoundData> soundVector;
public:
//Add sounds to be played once progress bar is hidden (such as after teleport or loading screen)
diff --git a/indra/newview/lldonotdisturbnotificationstorage.cpp b/indra/newview/lldonotdisturbnotificationstorage.cpp
index 7836e2cb94..7d2712eec7 100644
--- a/indra/newview/lldonotdisturbnotificationstorage.cpp
+++ b/indra/newview/lldonotdisturbnotificationstorage.cpp
@@ -69,8 +69,7 @@ BOOL LLDoNotDisturbNotificationStorageTimer::tick()
}
LLDoNotDisturbNotificationStorage::LLDoNotDisturbNotificationStorage()
- : LLSingleton<LLDoNotDisturbNotificationStorage>()
- , LLNotificationStorage("")
+ : LLNotificationStorage("")
, mDirty(false)
{
nameToPayloadParameterMap[toastName] = "SESSION_ID";
diff --git a/indra/newview/lldonotdisturbnotificationstorage.h b/indra/newview/lldonotdisturbnotificationstorage.h
index 6e68b0d1be..e6cb7835e3 100644
--- a/indra/newview/lldonotdisturbnotificationstorage.h
+++ b/indra/newview/lldonotdisturbnotificationstorage.h
@@ -47,14 +47,14 @@ public:
class LLDoNotDisturbNotificationStorage : public LLSingleton<LLDoNotDisturbNotificationStorage>, public LLNotificationStorage
{
+ LLSINGLETON(LLDoNotDisturbNotificationStorage);
+ ~LLDoNotDisturbNotificationStorage();
+
LOG_CLASS(LLDoNotDisturbNotificationStorage);
public:
static const char * toastName;
static const char * offerName;
- LLDoNotDisturbNotificationStorage();
- ~LLDoNotDisturbNotificationStorage();
-
void initialize();
bool getDirty();
void resetDirty();
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 84ead0bdde..60056ac21d 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -401,7 +401,9 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass)
if ((params.mVertexBuffer->getTypeMask() & mask) != mask)
{ //FIXME!
- LL_WARNS() << "Missing required components, skipping render batch." << LL_ENDL;
+ LL_WARNS_ONCE() << "Missing required components, expected mask: " << mask
+ << " present: " << (params.mVertexBuffer->getTypeMask() & mask)
+ << ". Skipping render batch." << LL_ENDL;
continue;
}
diff --git a/indra/newview/llenvmanager.cpp b/indra/newview/llenvmanager.cpp
index a626ad1bff..b97e483fd9 100644
--- a/indra/newview/llenvmanager.cpp
+++ b/indra/newview/llenvmanager.cpp
@@ -609,10 +609,15 @@ bool LLEnvManagerNew::useRegionSky()
return true;
}
- // *TODO: Support fixed sky from region.
-
- // Otherwise apply region day cycle.
+ // Otherwise apply region day cycle/skies.
LL_DEBUGS("Windlight") << "Applying region sky" << LL_ENDL;
+
+ // *TODO: Support fixed sky from region. Just do sky reset for now.
+ if (region_settings.getSkyMap().size() == 1)
+ {
+ // Region is set to fixed sky. Reset.
+ useSkyParams(region_settings.getSkyMap().beginMap()->second);
+ }
return useDayCycleParams(
region_settings.getWLDayCycle(),
LLEnvKey::SCOPE_REGION,
diff --git a/indra/newview/llenvmanager.h b/indra/newview/llenvmanager.h
index c7877303fc..6a0a267f4e 100644
--- a/indra/newview/llenvmanager.h
+++ b/indra/newview/llenvmanager.h
@@ -162,14 +162,13 @@ public:
*/
class LLEnvManagerNew : public LLSingleton<LLEnvManagerNew>
{
+ LLSINGLETON(LLEnvManagerNew);
LOG_CLASS(LLEnvManagerNew);
public:
typedef boost::signals2::signal<void()> prefs_change_signal_t;
typedef boost::signals2::signal<void()> region_settings_change_signal_t;
typedef boost::signals2::signal<void(bool)> region_settings_applied_signal_t;
- LLEnvManagerNew();
-
// getters to access user env. preferences
bool getUseRegionSettings() const;
bool getUseDayCycle() const;
@@ -231,7 +230,6 @@ public:
void onRegionSettingsApplyResponse(bool ok);
private:
- friend class LLSingleton<LLEnvManagerNew>;
/*virtual*/ void initSingleton();
void loadUserPrefs();
diff --git a/indra/newview/llestateinfomodel.h b/indra/newview/llestateinfomodel.h
index fcfbd1ce7d..e7a6a2a725 100644
--- a/indra/newview/llestateinfomodel.h
+++ b/indra/newview/llestateinfomodel.h
@@ -38,6 +38,7 @@ class LLMessageSystem;
*/
class LLEstateInfoModel : public LLSingleton<LLEstateInfoModel>
{
+ LLSINGLETON(LLEstateInfoModel);
LOG_CLASS(LLEstateInfoModel);
public:
@@ -73,11 +74,8 @@ public:
protected:
typedef std::vector<std::string> strings_t;
- friend class LLSingleton<LLEstateInfoModel>;
friend class LLDispatchEstateUpdateInfo;
- LLEstateInfoModel();
-
/// refresh model with data from the incoming server message
void update(const strings_t& strings);
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index f0331f20d8..314b859cea 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -63,10 +63,10 @@ public:
{
return start_offset;
}
- /*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const
+ /*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const
{
// require full line to ourselves
- if (line_offset == 0)
+ if (line_offset == 0)
{
// print all our text
return getEnd() - getStart();
diff --git a/indra/newview/llexperiencelog.h b/indra/newview/llexperiencelog.h
index ac227db336..09e0cd8821 100644
--- a/indra/newview/llexperiencelog.h
+++ b/indra/newview/llexperiencelog.h
@@ -33,6 +33,7 @@
class LLExperienceLog : public LLSingleton<LLExperienceLog>
{
+ LLSINGLETON(LLExperienceLog);
public:
typedef boost::signals2::signal<void(LLSD&)>
callback_signal_t;
@@ -62,7 +63,6 @@ public:
void setEventsToSave(LLSD new_events){mEventsToSave = new_events; }
bool isNotExpired(std::string& date);
protected:
- LLExperienceLog();
void handleExperienceMessage(LLSD& message);
@@ -81,7 +81,6 @@ protected:
bool mNotifyNewEvent;
friend class LLExperienceLogDispatchHandler;
- friend class LLSingleton<LLExperienceLog>;
};
diff --git a/indra/newview/llfacebookconnect.h b/indra/newview/llfacebookconnect.h
index 2a2cdb5499..7fd4070f54 100644
--- a/indra/newview/llfacebookconnect.h
+++ b/indra/newview/llfacebookconnect.h
@@ -43,6 +43,8 @@ class LLEventPump;
*/
class LLFacebookConnect : public LLSingleton<LLFacebookConnect>
{
+ LLSINGLETON(LLFacebookConnect);
+ ~LLFacebookConnect() {};
LOG_CLASS(LLFacebookConnect);
public:
enum EConnectionState
@@ -86,10 +88,7 @@ public:
void openFacebookWeb(std::string url);
private:
- friend class LLSingleton<LLFacebookConnect>;
- LLFacebookConnect();
- ~LLFacebookConnect() {};
std::string getFacebookConnectURL(const std::string& route = "", bool include_read_from_master = false);
EConnectionState mConnectionState;
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index d1e77f57e2..a69b3b7dc7 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -238,7 +238,7 @@ BOOL LLFastTimerView::handleHover(S32 x, S32 y, MASK mask)
{
return TRUE;
}
- else if (mHoverBarIndex == -1)
+ else if (mHoverBarIndex < 0)
{
mHoverBarIndex = 0;
}
@@ -260,7 +260,7 @@ BOOL LLFastTimerView::handleHover(S32 x, S32 y, MASK mask)
{
hover_bar = &bar;
if (bar.mTimeBlock->getTreeNode().mCollapsed)
- {
+ {
// stop on first collapsed BlockTimerStatHandle, since we can't select any children
break;
}
diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h
index 2115f77cf3..cac32c7f2a 100644
--- a/indra/newview/llfavoritesbar.h
+++ b/indra/newview/llfavoritesbar.h
@@ -34,6 +34,7 @@
#include "llinventoryobserver.h"
#include "llinventorymodel.h"
#include "llviewerinventory.h"
+#include "llinitdestroyclass.h"
class LLMenuItemCallGL;
class LLToggleableMenu;
@@ -173,6 +174,7 @@ private:
class LLFavoritesOrderStorage : public LLSingleton<LLFavoritesOrderStorage>
, public LLDestroyClass<LLFavoritesOrderStorage>
{
+ LLSINGLETON(LLFavoritesOrderStorage);
LOG_CLASS(LLFavoritesOrderStorage);
public:
/**
@@ -221,10 +223,6 @@ public:
std::map<LLUUID,std::string> mFavoriteNames;
private:
- friend class LLSingleton<LLFavoritesOrderStorage>;
- LLFavoritesOrderStorage() : mIsDirty(false), mUpdateRequired(false){ load(); }
- ~LLFavoritesOrderStorage() {}
-
/**
* Removes sort indexes for items which are not in Favorites bar for now.
*/
@@ -274,4 +272,10 @@ private:
};
};
+
+inline
+LLFavoritesOrderStorage::LLFavoritesOrderStorage() :
+ mIsDirty(false), mUpdateRequired(false)
+{ load(); }
+
#endif // LL_LLFAVORITESBARCTRL_H
diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h
index c3d87cea0b..54bd07329a 100644
--- a/indra/newview/llfeaturemanager.h
+++ b/indra/newview/llfeaturemanager.h
@@ -97,20 +97,10 @@ protected:
class LLFeatureManager : public LLFeatureList, public LLSingleton<LLFeatureManager>
{
-public:
- LLFeatureManager()
- : LLFeatureList("default"),
-
- mInited(FALSE),
- mTableVersion(0),
- mSafe(FALSE),
- mGPUClass(GPU_CLASS_UNKNOWN),
- mExpectedGLVersion(0.f),
- mGPUSupported(FALSE)
- {
- }
+ LLSINGLETON(LLFeatureManager);
~LLFeatureManager() {cleanupFeatureTables();}
+public:
// initialize this by loading feature table and gpu table
void init();
@@ -181,5 +171,17 @@ protected:
BOOL mGPUSupported;
};
+inline
+LLFeatureManager::LLFeatureManager()
+: LLFeatureList("default"),
+
+ mInited(FALSE),
+ mTableVersion(0),
+ mSafe(FALSE),
+ mGPUClass(GPU_CLASS_UNKNOWN),
+ mExpectedGLVersion(0.f),
+ mGPUSupported(FALSE)
+{
+}
#endif // LL_LLFEATUREMANAGER_H
diff --git a/indra/newview/llfilteredwearablelist.cpp b/indra/newview/llfilteredwearablelist.cpp
index a29ccf2b6d..f2af9b5300 100644
--- a/indra/newview/llfilteredwearablelist.cpp
+++ b/indra/newview/llfilteredwearablelist.cpp
@@ -93,4 +93,9 @@ void LLFilteredWearableListManager::populateList()
mWearableList->refreshList(item_array);
}
+void LLFilteredWearableListManager::holdProgress()
+{
+ mWearableList->setForceRefresh(false);
+}
+
// EOF
diff --git a/indra/newview/llfilteredwearablelist.h b/indra/newview/llfilteredwearablelist.h
index c21458ca98..f44ab1466f 100644
--- a/indra/newview/llfilteredwearablelist.h
+++ b/indra/newview/llfilteredwearablelist.h
@@ -56,6 +56,11 @@ public:
*/
void populateList();
+ /**
+ * Drop operation
+ */
+ void holdProgress();
+
private:
LLInventoryItemsList* mWearableList;
LLInventoryCollectFunctor* mCollector;
diff --git a/indra/newview/llflickrconnect.h b/indra/newview/llflickrconnect.h
index 0155804da0..43cadca708 100644
--- a/indra/newview/llflickrconnect.h
+++ b/indra/newview/llflickrconnect.h
@@ -43,6 +43,8 @@ class LLEventPump;
*/
class LLFlickrConnect : public LLSingleton<LLFlickrConnect>
{
+ LLSINGLETON(LLFlickrConnect);
+ ~LLFlickrConnect() {};
LOG_CLASS(LLFlickrConnect);
public:
enum EConnectionState
@@ -80,10 +82,7 @@ public:
void openFlickrWeb(std::string url);
private:
- friend class LLSingleton<LLFlickrConnect>;
- LLFlickrConnect();
- ~LLFlickrConnect() {};
std::string getFlickrConnectURL(const std::string& route = "", bool include_read_from_master = false);
EConnectionState mConnectionState;
diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index aa7bfbfdb7..c394eb815b 100644
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -502,37 +502,39 @@ void LLFloaterAvatarPicker::find()
url.reserve(128); // avoid a memory allocation or two
LLViewerRegion* region = gAgent.getRegion();
- url = region->getCapability("AvatarPickerSearch");
- // Prefer use of capabilities to search on both SLID and display name
- if (!url.empty())
+ if(region)
{
- // capability urls don't end in '/', but we need one to parse
- // query parameters correctly
- if (url.size() > 0 && url[url.size()-1] != '/')
+ url = region->getCapability("AvatarPickerSearch");
+ // Prefer use of capabilities to search on both SLID and display name
+ if (!url.empty())
{
- url += "/";
- }
- url += "?page_size=100&names=";
- std::replace(text.begin(), text.end(), '.', ' ');
- url += LLURI::escape(text);
- LL_INFOS() << "avatar picker " << url << LL_ENDL;
+ // capability urls don't end in '/', but we need one to parse
+ // query parameters correctly
+ if (url.size() > 0 && url[url.size()-1] != '/')
+ {
+ url += "/";
+ }
+ url += "?page_size=100&names=";
+ std::replace(text.begin(), text.end(), '.', ' ');
+ url += LLURI::escape(text);
+ LL_INFOS() << "avatar picker " << url << LL_ENDL;
- LLCoros::instance().launch("LLFloaterAvatarPicker::findCoro",
- boost::bind(&LLFloaterAvatarPicker::findCoro, url, mQueryID, getKey().asString()));
- }
- else
- {
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessage("AvatarPickerRequest");
- msg->nextBlock("AgentData");
- msg->addUUID("AgentID", gAgent.getID());
- msg->addUUID("SessionID", gAgent.getSessionID());
- msg->addUUID("QueryID", mQueryID); // not used right now
- msg->nextBlock("Data");
- msg->addString("Name", text);
- gAgent.sendReliableMessage();
+ LLCoros::instance().launch("LLFloaterAvatarPicker::findCoro",
+ boost::bind(&LLFloaterAvatarPicker::findCoro, url, mQueryID, getKey().asString()));
+ }
+ else
+ {
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessage("AvatarPickerRequest");
+ msg->nextBlock("AgentData");
+ msg->addUUID("AgentID", gAgent.getID());
+ msg->addUUID("SessionID", gAgent.getSessionID());
+ msg->addUUID("QueryID", mQueryID); // not used right now
+ msg->nextBlock("Data");
+ msg->addString("Name", text);
+ gAgent.sendReliableMessage();
+ }
}
-
getChild<LLScrollListCtrl>("SearchResults")->deleteAllItems();
getChild<LLScrollListCtrl>("SearchResults")->setCommentText(getString("searching"));
diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp
index b32ac860aa..4607b4ac41 100644
--- a/indra/newview/llfloaterbuycontents.cpp
+++ b/indra/newview/llfloaterbuycontents.cpp
@@ -44,7 +44,6 @@
#include "llinventorymodel.h" // for gInventory
#include "llfirstuse.h"
#include "llfloaterreg.h"
-#include "llfloaterinventory.h" // for LLInventoryIcon::getIcon
#include "llnotificationsutil.h"
#include "llselectmgr.h"
#include "llscrolllistctrl.h"
diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp
index d33a138e94..5f606ec326 100644
--- a/indra/newview/llfloaterbvhpreview.cpp
+++ b/indra/newview/llfloaterbvhpreview.cpp
@@ -1004,7 +1004,7 @@ void LLFloaterBvhPreview::onBtnOK(void* userdata)
{
std::string name = floaterp->getChild<LLUICtrl>("name_form")->getValue().asString();
std::string desc = floaterp->getChild<LLUICtrl>("description_form")->getValue().asString();
- S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ S32 expected_upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload();
LLResourceUploadInfo::ptr_t assetUpdloadInfo(new LLResourceUploadInfo(
floaterp->mTransactionID, LLAssetType::AT_ANIMATION,
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index 15b67b905d..7007c58b3c 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -101,7 +101,7 @@ LLFloaterIMContainer::~LLFloaterIMContainer()
gSavedPerAccountSettings.setBOOL("ConversationsMessagePaneCollapsed", mMessagesPane->isCollapsed());
gSavedPerAccountSettings.setBOOL("ConversationsParticipantListCollapsed", !isParticipantListExpanded());
- if (!LLSingleton<LLIMMgr>::destroyed())
+ if (LLIMMgr::instanceExists())
{
LLIMMgr::getInstance()->removeSessionObserver(this);
}
@@ -1505,15 +1505,21 @@ bool LLFloaterIMContainer::checkContextMenuItem(const std::string& item, uuid_ve
bool LLFloaterIMContainer::visibleContextMenuItem(const LLSD& userdata)
{
+ const LLConversationItem *conversation_item = getCurSelectedViewModelItem();
+ if(!conversation_item)
+ {
+ return false;
+ }
+
const std::string& item = userdata.asString();
if ("show_mute" == item)
{
- return !isMuted(getCurSelectedViewModelItem()->getUUID());
+ return !isMuted(conversation_item->getUUID());
}
else if ("show_unmute" == item)
{
- return isMuted(getCurSelectedViewModelItem()->getUUID());
+ return isMuted(conversation_item->getUUID());
}
return true;
diff --git a/indra/newview/llfloaterimnearbychathandler.cpp b/indra/newview/llfloaterimnearbychathandler.cpp
index 9fd731ed56..4cd91c53d8 100644
--- a/indra/newview/llfloaterimnearbychathandler.cpp
+++ b/indra/newview/llfloaterimnearbychathandler.cpp
@@ -285,6 +285,14 @@ void LLFloaterIMNearbyChatScreenChannel::addChat(LLSD& chat)
if(mStopProcessing)
return;
+ if (mFloaterSnapRegion == NULL)
+ {
+ mFloaterSnapRegion = gViewerWindow->getRootView()->getChildView("floater_snap_region");
+ }
+ LLRect channel_rect;
+ mFloaterSnapRegion->localRectToOtherView(mFloaterSnapRegion->getLocalRect(), &channel_rect, gFloaterView);
+ chat["available_height"] = channel_rect.getHeight() - channel_rect.mBottom - gSavedSettings.getS32("ToastGap") - 110;;
+
/*
find last toast and check ID
*/
@@ -380,7 +388,7 @@ void LLFloaterIMNearbyChatScreenChannel::arrangeToasts()
setFollows(FOLLOWS_ALL);
}
- LLRect toast_rect;
+ LLRect toast_rect;
updateRect();
LLRect channel_rect;
diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp
deleted file mode 100644
index 9b9b90e521..0000000000
--- a/indra/newview/llfloaterinventory.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * @file llfloaterinventory.cpp
- * @brief Implementation of the inventory view and associated stuff.
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterinventory.h"
-
-#include "llagentcamera.h"
-//#include "llfirstuse.h"
-#include "llfloaterreg.h"
-#include "llinventorymodel.h"
-#include "llpanelmaininventory.h"
-#include "llresmgr.h"
-#include "llviewerfoldertype.h"
-#include "lltransientfloatermgr.h"
-
-///----------------------------------------------------------------------------
-/// LLFloaterInventory
-///----------------------------------------------------------------------------
-
-LLFloaterInventory::LLFloaterInventory(const LLSD& key)
- : LLFloater(key)
-{
- LLTransientFloaterMgr::getInstance()->addControlView(this);
-}
-
-LLFloaterInventory::~LLFloaterInventory()
-{
- LLTransientFloaterMgr::getInstance()->removeControlView(this);
-}
-
-BOOL LLFloaterInventory::postBuild()
-{
- mPanelMainInventory = findChild<LLPanelMainInventory>("Inventory Panel");
- return TRUE;
-}
-
-LLInventoryPanel* LLFloaterInventory::getPanel()
-{
- if (mPanelMainInventory)
- return mPanelMainInventory->getPanel();
- return NULL;
-}
-
-// static
-LLFloaterInventory* LLFloaterInventory::showAgentInventory()
-{
- // Hack to generate semi-unique key for each inventory floater.
- static S32 instance_num = 0;
- instance_num = (instance_num + 1) % S32_MAX;
-
- LLFloaterInventory* iv = NULL;
- if (!gAgentCamera.cameraMouselook())
- {
- iv = LLFloaterReg::showTypedInstance<LLFloaterInventory>("inventory", LLSD(instance_num));
- }
- return iv;
-}
-
-// static
-void LLFloaterInventory::cleanup()
-{
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end();)
- {
- LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter++);
- if (iv)
- {
- iv->destroy();
- }
- }
-}
-
-void LLFloaterInventory::onOpen(const LLSD& key)
-{
- //LLFirstUse::useInventory();
-}
-
-void LLFloaterInventory::onClose(bool app_quitting)
-{
- LLFloater::onClose(app_quitting);
- if (mKey.asInteger() > 1)
- {
- destroy();
- }
-}
diff --git a/indra/newview/llfloaterinventory.h b/indra/newview/llfloaterinventory.h
deleted file mode 100644
index 823c4903b4..0000000000
--- a/indra/newview/llfloaterinventory.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * @file llfloaterinventory.h
- * @brief LLFloaterInventory, LLInventoryFolder, and LLInventoryItem
- * class definition
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLFLOATERINVENTORY_H
-#define LL_LLFLOATERINVENTORY_H
-
-#include "llfloater.h"
-#include "llfoldertype.h"
-
-class LLInventoryPanel;
-class LLPanelMainInventory;
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLFloaterInventory
-//
-// This deals with the buttons and views used to navigate as
-// well as controlling the behavior of the overall object.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLFloaterInventory : public LLFloater
-{
-public:
- LLFloaterInventory(const LLSD& key);
- ~LLFloaterInventory();
-
- BOOL postBuild();
-
- // This method makes sure that an inventory view exists, is
- // visible, and has focus. The view chosen is returned.
- static LLFloaterInventory* showAgentInventory();
-
- // Final cleanup, destroy all open inventory views.
- static void cleanup();
-
- // Inherited functionality
- /*virtual*/ void onOpen(const LLSD& key);
- /*virtual*/ void onClose(bool app_quitting);
-
- LLInventoryPanel* getPanel();
- LLPanelMainInventory* getMainInventoryPanel() { return mPanelMainInventory;}
-private:
- LLPanelMainInventory* mPanelMainInventory;
-};
-
-#endif // LL_LLFLOATERINVENTORY_H
-
-
-
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 7f952d4dd4..a340cd1143 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -2029,7 +2029,6 @@ void LLPanelLandOptions::refresh()
else
{
// something selected, hooray!
- LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion();
// Display options
BOOL can_change_options = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_OPTIONS);
@@ -2045,9 +2044,8 @@ void LLPanelLandOptions::refresh()
mCheckGroupObjectEntry ->set( parcel->getAllowGroupObjectEntry() || parcel->getAllowAllObjectEntry());
mCheckGroupObjectEntry ->setEnabled( can_change_options && !parcel->getAllowAllObjectEntry() );
- BOOL region_damage = regionp ? regionp->getAllowDamage() : FALSE;
mCheckSafe ->set( !parcel->getAllowDamage() );
- mCheckSafe ->setEnabled( can_change_options && region_damage );
+ mCheckSafe ->setEnabled( can_change_options );
mCheckFly ->set( parcel->getAllowFly() );
mCheckFly ->setEnabled( can_change_options );
@@ -2127,6 +2125,7 @@ void LLPanelLandOptions::refresh()
// they can see the checkbox, but its disposition depends on the
// state of the region
+ LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion();
if (regionp)
{
if (regionp->getSimAccess() == SIM_ACCESS_PG)
@@ -2448,6 +2447,7 @@ void LLPanelLandAccess::refresh()
mListAccess->deleteAllItems();
S32 count = parcel->mAccessList.size();
getChild<LLUICtrl>("AllowedText")->setTextArg("[COUNT]", llformat("%d",count));
+ getChild<LLUICtrl>("AllowedText")->setTextArg("[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));
getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",count));
getChild<LLUICtrl>("AccessList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",PARCEL_MAX_ACCESS_LIST));
@@ -2495,6 +2495,7 @@ void LLPanelLandAccess::refresh()
mListBanned->deleteAllItems();
S32 count = parcel->mBanList.size();
getChild<LLUICtrl>("BanCheck")->setTextArg("[COUNT]", llformat("%d",count));
+ getChild<LLUICtrl>("BanCheck")->setTextArg("[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));
getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[LISTED]"), llformat("%d",count));
getChild<LLUICtrl>("BannedList")->setToolTipArg(LLStringExplicit("[MAX]"), llformat("%d",PARCEL_MAX_ACCESS_LIST));
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 7aae48cf5d..c654817849 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -1197,6 +1197,7 @@ void LLFloaterModelPreview::onMouseCaptureLostModelPreview(LLMouseHandler* handl
LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
: LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE), LLMutex(NULL)
, mLodsQuery()
+, mLodsWithParsingError()
, mPelvisZOffset( 0.0f )
, mLegacyRigValid( false )
, mRigValidJointUpload( false )
@@ -1780,8 +1781,8 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable
// this is the initial file picking. Close the whole floater
// if we don't have a base model to show for high LOD.
mFMP->closeFloater(false);
- mLoading = false;
}
+ mLoading = false;
return;
}
@@ -1938,9 +1939,16 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)
{
mLoading = false ;
mModelLoader = NULL;
+ mLodsWithParsingError.push_back(loaded_lod);
return ;
}
+ mLodsWithParsingError.erase(std::remove(mLodsWithParsingError.begin(), mLodsWithParsingError.end(), loaded_lod), mLodsWithParsingError.end());
+ if(mLodsWithParsingError.empty())
+ {
+ mFMP->childEnable( "calculate_btn" );
+ }
+
// Copy determinations about rig so UI will reflect them
//
setRigValidForJointPositionUpload(mModelLoader->isRigValidForJointPositionUpload());
@@ -2162,7 +2170,11 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)
if (!mBaseModel.empty())
{
const std::string& model_name = mBaseModel[0]->getName();
- mFMP->getChild<LLUICtrl>("description_form")->setValue(model_name);
+ LLLineEditor* description_form = mFMP->getChild<LLLineEditor>("description_form");
+ if (description_form->getText().empty())
+ {
+ description_form->setText(model_name);
+ }
}
}
refresh();
@@ -2687,17 +2699,7 @@ void LLModelPreview::updateStatusMessages()
setLoadState( LLModelLoader::ERROR_MATERIALS );
mFMP->childDisable( "calculate_btn" );
}
-
- int refFaceCnt = 0;
- int modelFaceCnt = 0;
-
- if (!lod_model->matchMaterialOrder(model_high_lod, refFaceCnt, modelFaceCnt ) )
- {
- setLoadState( LLModelLoader::ERROR_MATERIALS );
- mFMP->childDisable( "calculate_btn" );
- }
-
- if (lod_model)
+ else
{
//for each model in the lod
S32 cur_tris = 0;
@@ -3630,7 +3632,7 @@ BOOL LLModelPreview::render()
}
}
- if (has_skin_weights)
+ if (has_skin_weights && lodsReady())
{ //model has skin weights, enable view options for skin weights and joint positions
if (fmp && isLegacyRigValid() )
{
@@ -4555,4 +4557,12 @@ void LLFloaterModelPreview::setPermissonsErrorStatus(S32 status, const std::stri
LLNotificationsUtil::add("MeshUploadPermError");
}
+bool LLFloaterModelPreview::isModelLoading()
+{
+ if(mModelPreview)
+ {
+ return mModelPreview->mLoading;
+ }
+ return false;
+}
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index a7a5c1b33a..0b2b7db2b6 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -115,6 +115,8 @@ public:
void enableViewOption(const std::string& option);
void disableViewOption(const std::string& option);
+ bool isModelLoading();
+
// shows warning message if agent has no permissions to upload model
/*virtual*/ void onPermissionsReceived(const LLSD& result);
@@ -304,6 +306,7 @@ public:
static bool sIgnoreLoadedCallback;
std::vector<S32> mLodsQuery;
+ std::vector<S32> mLodsWithParsingError;
protected:
diff --git a/indra/newview/llfloatermodeluploadbase.cpp b/indra/newview/llfloatermodeluploadbase.cpp
index 0fe97fd610..7cdfd56d9a 100644
--- a/indra/newview/llfloatermodeluploadbase.cpp
+++ b/indra/newview/llfloatermodeluploadbase.cpp
@@ -80,6 +80,7 @@ void LLFloaterModelUploadBase::requestAgentUploadPermissionsCoro(std::string url
if (!observer)
{
LL_WARNS("MeshUploadFlag") << "Unable to get observer after call to '" << url << "' aborting." << LL_ENDL;
+ return;
}
if (!status)
diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp
index 4a5732aecf..c9a689281e 100644
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -123,7 +123,7 @@ BOOL LLFloaterNameDesc::postBuild()
// Cancel button
getChild<LLUICtrl>("cancel_btn")->setCommitCallback(boost::bind(&LLFloaterNameDesc::onBtnCancel, this));
- getChild<LLUICtrl>("ok_btn")->setLabelArg("[AMOUNT]", llformat("%d", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload() ));
+ getChild<LLUICtrl>("ok_btn")->setLabelArg("[AMOUNT]", llformat("%d", LLGlobalEconomy::getInstance()->getPriceUpload() ));
setDefaultBtn("ok_btn");
@@ -162,7 +162,7 @@ void LLFloaterNameDesc::onBtnOK( )
getChildView("ok_btn")->setEnabled(FALSE); // 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).
+ S32 expected_upload_cost = LLGlobalEconomy::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).
if (can_afford_transaction(expected_upload_cost))
{
diff --git a/indra/newview/llfloaterobjectweights.cpp b/indra/newview/llfloaterobjectweights.cpp
index feaeef4ad0..ed1ad4426f 100644
--- a/indra/newview/llfloaterobjectweights.cpp
+++ b/indra/newview/llfloaterobjectweights.cpp
@@ -145,6 +145,14 @@ void LLFloaterObjectWeights::updateLandImpacts(const LLParcel* parcel)
{
S32 rezzed_prims = parcel->getSimWidePrimCount();
S32 total_capacity = parcel->getSimWideMaxPrimCapacity();
+ // Can't have more than region max tasks, regardless of parcel
+ // object bonus factor.
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if (region)
+ {
+ S32 max_tasks_per_region = (S32)region->getMaxTasks();
+ total_capacity = llmin(total_capacity, max_tasks_per_region);
+ }
mRezzedOnLand->setText(llformat("%d", rezzed_prims));
mRemainingCapacity->setText(llformat("%d", total_capacity - rezzed_prims));
diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp
index ef746d308d..2a1749bd42 100644
--- a/indra/newview/llfloateropenobject.cpp
+++ b/indra/newview/llfloateropenobject.cpp
@@ -39,7 +39,6 @@
#include "lltextbox.h"
#include "llinventorybridge.h"
-#include "llfloaterinventory.h"
#include "llinventorymodel.h"
#include "llinventorypanel.h"
#include "llpanelobjectinventory.h"
diff --git a/indra/newview/llfloateroutfitphotopreview.cpp b/indra/newview/llfloateroutfitphotopreview.cpp
new file mode 100644
index 0000000000..6c39db730c
--- /dev/null
+++ b/indra/newview/llfloateroutfitphotopreview.cpp
@@ -0,0 +1,289 @@
+/**
+ * @file llfloateroutfitphotopreview.cpp
+ * @brief LLFloaterOutfitPhotoPreview class implementation
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llwindow.h"
+
+#include "llfloateroutfitphotopreview.h"
+
+#include "llagent.h"
+#include "llappearancemgr.h"
+#include "llbutton.h"
+#include "llcombobox.h"
+#include "llfilepicker.h"
+#include "llfloaterreg.h"
+#include "llimagetga.h"
+#include "llimagepng.h"
+#include "llinventory.h"
+#include "llinventorymodel.h"
+#include "llnotificationsutil.h"
+#include "llresmgr.h"
+#include "lltrans.h"
+#include "lltextbox.h"
+#include "lltextureview.h"
+#include "llui.h"
+#include "llviewerinventory.h"
+#include "llviewertexture.h"
+#include "llviewertexturelist.h"
+#include "lluictrlfactory.h"
+#include "llviewerwindow.h"
+#include "lllineeditor.h"
+
+const S32 MAX_OUTFIT_PHOTO_WIDTH = 256;
+const S32 MAX_OUTFIT_PHOTO_HEIGHT = 256;
+
+const S32 CLIENT_RECT_VPAD = 4;
+
+LLFloaterOutfitPhotoPreview::LLFloaterOutfitPhotoPreview(const LLSD& key)
+ : LLPreview(key),
+ mUpdateDimensions(TRUE),
+ mImage(NULL),
+ mOutfitID(LLUUID()),
+ mImageOldBoostLevel(LLGLTexture::BOOST_NONE),
+ mExceedLimits(FALSE)
+{
+ updateImageID();
+}
+
+LLFloaterOutfitPhotoPreview::~LLFloaterOutfitPhotoPreview()
+{
+ LLLoadedCallbackEntry::cleanUpCallbackList(&mCallbackTextureList) ;
+
+ if (mImage.notNull())
+ {
+ mImage->setBoostLevel(mImageOldBoostLevel);
+ mImage = NULL;
+ }
+}
+
+// virtual
+BOOL LLFloaterOutfitPhotoPreview::postBuild()
+{
+ getChild<LLButton>("ok_btn")->setClickedCallback(boost::bind(&LLFloaterOutfitPhotoPreview::onOkBtn, this));
+ getChild<LLButton>("cancel_btn")->setClickedCallback(boost::bind(&LLFloaterOutfitPhotoPreview::onCancelBtn, this));
+
+ return LLPreview::postBuild();
+}
+
+void LLFloaterOutfitPhotoPreview::draw()
+{
+ updateDimensions();
+
+ LLPreview::draw();
+
+ if (!isMinimized())
+ {
+ LLGLSUIDefault gls_ui;
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+ const LLRect& border = mClientRect;
+ LLRect interior = mClientRect;
+ interior.stretch( -PREVIEW_BORDER_WIDTH );
+
+ // ...border
+ gl_rect_2d( border, LLColor4(0.f, 0.f, 0.f, 1.f));
+ gl_rect_2d_checkerboard( interior );
+
+ if ( mImage.notNull() )
+ {
+ // Draw the texture
+ gGL.diffuseColor3f( 1.f, 1.f, 1.f );
+ gl_draw_scaled_image(interior.mLeft,
+ interior.mBottom,
+ interior.getWidth(),
+ interior.getHeight(),
+ mImage);
+
+ // Pump the texture priority
+ F32 pixel_area = (F32)(interior.getWidth() * interior.getHeight() );
+ mImage->addTextureStats( pixel_area );
+
+ S32 int_width = interior.getWidth();
+ S32 int_height = interior.getHeight();
+ mImage->setKnownDrawSize(int_width, int_height);
+ }
+ }
+
+}
+
+// virtual
+void LLFloaterOutfitPhotoPreview::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ LLPreview::reshape(width, height, called_from_parent);
+
+ LLRect dim_rect(getChildView("dimensions")->getRect());
+
+ S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE;
+
+ S32 info_height = dim_rect.mTop + CLIENT_RECT_VPAD;
+
+ LLRect client_rect(horiz_pad, getRect().getHeight(), getRect().getWidth() - horiz_pad, 0);
+ client_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD);
+ client_rect.mBottom += PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height ;
+
+ S32 client_width = client_rect.getWidth();
+ S32 client_height = client_width;
+
+ if(client_height > client_rect.getHeight())
+ {
+ client_height = client_rect.getHeight();
+ client_width = client_height;
+ }
+ mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height);
+
+}
+
+
+void LLFloaterOutfitPhotoPreview::updateDimensions()
+{
+ if (!mImage)
+ {
+ return;
+ }
+ if ((mImage->getFullWidth() * mImage->getFullHeight()) == 0)
+ {
+ return;
+ }
+
+ if (mAssetStatus != PREVIEW_ASSET_LOADED)
+ {
+ mAssetStatus = PREVIEW_ASSET_LOADED;
+ mUpdateDimensions = TRUE;
+ }
+
+ getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]", llformat("%d", mImage->getFullWidth()));
+ getChild<LLUICtrl>("dimensions")->setTextArg("[HEIGHT]", llformat("%d", mImage->getFullHeight()));
+
+ if ((mImage->getFullWidth() <= MAX_OUTFIT_PHOTO_WIDTH) && (mImage->getFullHeight() <= MAX_OUTFIT_PHOTO_HEIGHT))
+ {
+ getChild<LLButton>("ok_btn")->setEnabled(TRUE);
+ mExceedLimits = FALSE;
+ }
+ else
+ {
+ mExceedLimits = TRUE;
+ LLStringUtil::format_map_t args;
+ args["MAX_WIDTH"] = llformat("%d", MAX_OUTFIT_PHOTO_WIDTH);
+ args["MAX_HEIGHT"] = llformat("%d", MAX_OUTFIT_PHOTO_HEIGHT);
+ std::string label = getString("exceed_limits", args);
+ getChild<LLUICtrl>("notification")->setValue(label);
+ getChild<LLUICtrl>("notification")->setColor(LLColor4::yellow);
+ getChild<LLButton>("ok_btn")->setEnabled(FALSE);
+ }
+
+ if (mUpdateDimensions)
+ {
+ mUpdateDimensions = FALSE;
+
+ reshape(getRect().getWidth(), getRect().getHeight());
+ gFloaterView->adjustToFitScreen(this, FALSE);
+ }
+}
+
+void LLFloaterOutfitPhotoPreview::loadAsset()
+{
+ if (mImage.notNull())
+ {
+ mImage->setBoostLevel(mImageOldBoostLevel);
+ }
+ mImage = LLViewerTextureManager::getFetchedTexture(mImageID, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+ mImageOldBoostLevel = mImage->getBoostLevel();
+ mImage->setBoostLevel(LLGLTexture::BOOST_PREVIEW);
+ mImage->forceToSaveRawImage(0) ;
+ mAssetStatus = PREVIEW_ASSET_LOADING;
+ mUpdateDimensions = TRUE;
+ updateDimensions();
+}
+
+LLPreview::EAssetStatus LLFloaterOutfitPhotoPreview::getAssetStatus()
+{
+ if (mImage.notNull() && (mImage->getFullWidth() * mImage->getFullHeight() > 0))
+ {
+ mAssetStatus = PREVIEW_ASSET_LOADED;
+ }
+ return mAssetStatus;
+}
+
+void LLFloaterOutfitPhotoPreview::updateImageID()
+{
+ const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem());
+ if(item)
+ {
+ mImageID = item->getAssetUUID();
+ LLPermissions perm(item->getPermissions());
+ }
+ else
+ {
+ mImageID = mItemUUID;
+ }
+
+}
+
+/* virtual */
+void LLFloaterOutfitPhotoPreview::setObjectID(const LLUUID& object_id)
+{
+ mObjectUUID = object_id;
+
+ const LLUUID old_image_id = mImageID;
+
+ updateImageID();
+ if (mImageID != old_image_id)
+ {
+ mAssetStatus = PREVIEW_ASSET_UNLOADED;
+ loadAsset();
+ }
+ refreshFromItem();
+}
+
+void LLFloaterOutfitPhotoPreview::setOutfitID(const LLUUID& outfit_id)
+{
+ mOutfitID = outfit_id;
+ LLViewerInventoryCategory* outfit_folder = gInventory.getCategory(mOutfitID);
+ if(outfit_folder && !mExceedLimits)
+ {
+ getChild<LLUICtrl>("notification")->setValue( getString("photo_confirmation"));
+ getChild<LLUICtrl>("notification")->setTextArg("[OUTFIT]", outfit_folder->getName());
+ getChild<LLUICtrl>("notification")->setColor(LLColor4::white);
+ }
+
+}
+
+void LLFloaterOutfitPhotoPreview::onOkBtn()
+{
+ if(mOutfitID.notNull() && getItem())
+ {
+ LLAppearanceMgr::instance().removeOutfitPhoto(mOutfitID);
+ LLPointer<LLInventoryCallback> cb = NULL;
+ link_inventory_object(mOutfitID, LLConstPointer<LLInventoryObject>(getItem()), cb);
+ }
+ closeFloater();
+}
+
+void LLFloaterOutfitPhotoPreview::onCancelBtn()
+{
+ closeFloater();
+}
diff --git a/indra/newview/llfloateroutfitphotopreview.h b/indra/newview/llfloateroutfitphotopreview.h
new file mode 100644
index 0000000000..a1e7b58abe
--- /dev/null
+++ b/indra/newview/llfloateroutfitphotopreview.h
@@ -0,0 +1,77 @@
+/**
+ * @file llfloateroutfitphotopreview.h
+ * @brief LLFloaterOutfitPhotoPreview class definition
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATEROUTFITPHOTOPREVIEW_H
+#define LL_LLFLOATEROUTFITPHOTOPREVIEW_H
+
+#include "llpreview.h"
+#include "llbutton.h"
+#include "llframetimer.h"
+#include "llviewertexture.h"
+
+class LLComboBox;
+class LLImageRaw;
+
+class LLFloaterOutfitPhotoPreview : public LLPreview
+{
+public:
+ LLFloaterOutfitPhotoPreview(const LLSD& key);
+ ~LLFloaterOutfitPhotoPreview();
+
+ virtual void draw();
+
+ virtual void loadAsset();
+ virtual EAssetStatus getAssetStatus();
+
+ virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
+ /*virtual*/ void setObjectID(const LLUUID& object_id);
+
+ void setOutfitID(const LLUUID& outfit_id);
+ void onOkBtn();
+ void onCancelBtn();
+
+protected:
+ void init();
+ /* virtual */ BOOL postBuild();
+
+private:
+ void updateImageID(); // set what image is being uploaded.
+ void updateDimensions();
+ LLUUID mImageID;
+ LLUUID mOutfitID;
+ LLPointer<LLViewerFetchedTexture> mImage;
+ S32 mImageOldBoostLevel;
+
+ // This is stored off in a member variable, because the save-as
+ // button and drag and drop functionality need to know.
+ BOOL mUpdateDimensions;
+
+ BOOL mExceedLimits;
+
+ LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;
+};
+#endif // LL_LLFLOATEROUTFITPHOTOPREVIEW_H
diff --git a/indra/newview/llfloaterpathfindingobjects.cpp b/indra/newview/llfloaterpathfindingobjects.cpp
index f6ff83eaf4..5cf16f3ad6 100644
--- a/indra/newview/llfloaterpathfindingobjects.cpp
+++ b/indra/newview/llfloaterpathfindingobjects.cpp
@@ -329,7 +329,7 @@ void LLFloaterPathfindingObjects::handleUpdateObjectList(LLPathfindingManager::r
}
}
-void LLFloaterPathfindingObjects::rebuildObjectsScrollList()
+void LLFloaterPathfindingObjects::rebuildObjectsScrollList(bool update_if_needed)
{
if (!mHasObjectsToBeSelected)
{
@@ -355,7 +355,14 @@ void LLFloaterPathfindingObjects::rebuildObjectsScrollList()
{
buildObjectsScrollList(mObjectList);
- mObjectsScrollList->selectMultiple(mObjectsToBeSelected);
+ if(mObjectsScrollList->selectMultiple(mObjectsToBeSelected) == 0)
+ {
+ if(update_if_needed && mRefreshListButton->getEnabled())
+ {
+ requestGetObjects();
+ return;
+ }
+ }
if (mHasObjectsToBeSelected)
{
mObjectsScrollList->scrollToShowSelected();
@@ -484,7 +491,7 @@ void LLFloaterPathfindingObjects::showFloaterWithSelectionObjects()
}
else
{
- rebuildObjectsScrollList();
+ rebuildObjectsScrollList(true);
if (isMinimized())
{
setMinimized(FALSE);
diff --git a/indra/newview/llfloaterpathfindingobjects.h b/indra/newview/llfloaterpathfindingobjects.h
index 4024e15fd6..752f741959 100644
--- a/indra/newview/llfloaterpathfindingobjects.h
+++ b/indra/newview/llfloaterpathfindingobjects.h
@@ -80,7 +80,7 @@ protected:
void handleNewObjectList(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::ERequestStatus pRequestStatus, LLPathfindingObjectListPtr pObjectList);
void handleUpdateObjectList(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::ERequestStatus pRequestStatus, LLPathfindingObjectListPtr pObjectList);
- void rebuildObjectsScrollList();
+ void rebuildObjectsScrollList(bool update_if_needed = false);
virtual void buildObjectsScrollList(const LLPathfindingObjectListPtr pObjectListPtr);
void addObjectToScrollList(const LLPathfindingObjectPtr pObjectPr, const LLSD &pScrollListItemData);
diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp
index dfe462c8d1..87973c2286 100644
--- a/indra/newview/llfloaterpay.cpp
+++ b/indra/newview/llfloaterpay.cpp
@@ -284,7 +284,6 @@ void LLFloaterPay::processPayPriceReply(LLMessageSystem* msg, void **userdata)
self->mQuickPayButton[i]->setLabelUnselected(button_str);
self->mQuickPayButton[i]->setVisible(TRUE);
self->mQuickPayInfo[i]->mAmount = pay_button;
- self->getChildView("fastpay text")->setVisible(TRUE);
if ( pay_button > max_pay_amount )
{
@@ -412,7 +411,6 @@ void LLFloaterPay::payDirectly(money_callback callback,
floater->getChildView("pay btn")->setVisible(TRUE);
floater->getChildView("amount text")->setVisible(TRUE);
- floater->getChildView("fastpay text")->setVisible(TRUE);
for(S32 i=0;i<MAX_PAY_BUTTONS;++i)
{
floater->mQuickPayButton[i]->setVisible(TRUE);
@@ -594,7 +592,8 @@ void LLFloaterPay::give(S32 amount)
else
{
// just transfer the L$
- mCallback(mTargetUUID, gAgent.getRegion(), amount, mTargetIsGroup, TRANS_GIFT, LLStringUtil::null);
+ std::string paymentMessage(getChild<LLLineEditor>("payment_message")->getValue().asString());
+ mCallback(mTargetUUID, gAgent.getRegion(), amount, mTargetIsGroup, TRANS_GIFT, (paymentMessage.empty() ? LLStringUtil::null : paymentMessage));
// check if the payee needs to be unmuted
LLMuteList::getInstance()->autoRemove(mTargetUUID, LLMuteList::AR_MONEY);
diff --git a/indra/newview/llfloaterperms.cpp b/indra/newview/llfloaterperms.cpp
index b0b2770c6e..2281ea1496 100644
--- a/indra/newview/llfloaterperms.cpp
+++ b/indra/newview/llfloaterperms.cpp
@@ -183,6 +183,11 @@ void LLFloaterPermsDefault::sendInitialPerms()
void LLFloaterPermsDefault::updateCap()
{
+ if (!gAgent.getRegion())
+ {
+ LL_WARNS("Avatar") << "Region not set, cannot request capability update" << LL_ENDL;
+ return;
+ }
std::string object_url = gAgent.getRegion()->getCapability("AgentPreferences");
if(!object_url.empty())
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 100ee5ab72..30dfff4ac8 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -467,6 +467,11 @@ BOOL LLFloaterPreference::postBuild()
gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeMaturity, this));
+ gSavedPerAccountSettings.getControl("ModelUploadFolder")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeModelFolder, this));
+ gSavedPerAccountSettings.getControl("TextureUploadFolder")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeTextureFolder, this));
+ gSavedPerAccountSettings.getControl("SoundUploadFolder")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeSoundFolder, this));
+ gSavedPerAccountSettings.getControl("AnimationUploadFolder")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeAnimationFolder, this));
+
LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
tabcontainer->selectFirstTab();
@@ -501,6 +506,7 @@ BOOL LLFloaterPreference::postBuild()
fov_slider->setMinValue(LLViewerCamera::getInstance()->getMinView());
fov_slider->setMaxValue(LLViewerCamera::getInstance()->getMaxView());
+
return TRUE;
}
@@ -742,7 +748,12 @@ void LLFloaterPreference::onOpen(const LLSD& key)
// Display selected maturity icons.
onChangeMaturity();
-
+
+ onChangeModelFolder();
+ onChangeTextureFolder();
+ onChangeSoundFolder();
+ onChangeAnimationFolder();
+
// Load (double-)click to walk/teleport settings.
updateClickActionControls();
@@ -1979,6 +1990,57 @@ void LLFloaterPreference::onChangeMaturity()
getChild<LLIconCtrl>("rating_icon_adult")->setVisible(sim_access == SIM_ACCESS_ADULT);
}
+std::string get_category_path(LLUUID cat_id)
+{
+ LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
+ if (cat->getParentUUID().notNull())
+ {
+ return get_category_path(cat->getParentUUID()) + " > " + cat->getName();
+ }
+ else
+ {
+ return cat->getName();
+ }
+}
+
+std::string get_category_path(LLFolderType::EType cat_type)
+{
+ LLUUID cat_id = gInventory.findUserDefinedCategoryUUIDForType(cat_type);
+ return get_category_path(cat_id);
+}
+
+void LLFloaterPreference::onChangeModelFolder()
+{
+ if (gInventory.isInventoryUsable())
+ {
+ getChild<LLTextBox>("upload_models")->setText(get_category_path(LLFolderType::FT_OBJECT));
+ }
+}
+
+void LLFloaterPreference::onChangeTextureFolder()
+{
+ if (gInventory.isInventoryUsable())
+ {
+ getChild<LLTextBox>("upload_textures")->setText(get_category_path(LLFolderType::FT_TEXTURE));
+ }
+}
+
+void LLFloaterPreference::onChangeSoundFolder()
+{
+ if (gInventory.isInventoryUsable())
+ {
+ getChild<LLTextBox>("upload_sounds")->setText(get_category_path(LLFolderType::FT_SOUND));
+ }
+}
+
+void LLFloaterPreference::onChangeAnimationFolder()
+{
+ if (gInventory.isInventoryUsable())
+ {
+ getChild<LLTextBox>("upload_animation")->setText(get_category_path(LLFolderType::FT_ANIMATION));
+ }
+}
+
// FIXME: this will stop you from spawning the sidetray from preferences dialog on login screen
// but the UI for this will still be enabled
void LLFloaterPreference::onClickBlockList()
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index fa0c09e97a..ea199cf034 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -161,6 +161,10 @@ public:
void onCommitMusicEnabled();
void applyResolution();
void onChangeMaturity();
+ void onChangeModelFolder();
+ void onChangeTextureFolder();
+ void onChangeSoundFolder();
+ void onChangeAnimationFolder();
void onClickBlockList();
void onClickProxySettings();
void onClickTranslationSettings();
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index a6ce0ba678..515c2b0c4b 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -35,8 +35,10 @@
#include "llassetstorage.h"
#include "llavatarnamecache.h"
#include "llcachename.h"
+#include "llcallbacklist.h"
#include "llcheckboxctrl.h"
#include "llfontgl.h"
+#include "llimagebmp.h"
#include "llimagej2c.h"
#include "llinventory.h"
#include "llnotificationsutil.h"
@@ -76,6 +78,7 @@
#include "llselectmgr.h"
#include "llversioninfo.h"
#include "lluictrlfactory.h"
+#include "llviewercontrol.h"
#include "llviewernetwork.h"
#include "llagentui.h"
@@ -86,6 +89,7 @@
#include "llcorehttputil.h"
#include "llviewerassetupload.h"
+const std::string SCREEN_PREV_FILENAME = "screen_report_last.bmp";
//=========================================================================
//-----------------------------------------------------------------------------
@@ -181,11 +185,6 @@ BOOL LLFloaterReporter::postBuild()
}
setPosBox(pos);
- // Take a screenshot, but don't draw this floater.
- setVisible(FALSE);
- takeScreenshot();
- setVisible(TRUE);
-
// Default text to be blank
getChild<LLUICtrl>("object_name")->setValue(LLStringUtil::null);
getChild<LLUICtrl>("owner_name")->setValue(LLStringUtil::null);
@@ -213,7 +212,7 @@ BOOL LLFloaterReporter::postBuild()
// grab the user's name
std::string reporter = LLSLURL("agent", gAgent.getID(), "inspect").getSLURLString();
getChild<LLUICtrl>("reporter_field")->setValue(reporter);
-
+
center();
return TRUE;
@@ -512,50 +511,59 @@ void LLFloaterReporter::showFromMenu(EReportType report_type)
LL_WARNS() << "Unknown LLViewerReporter type : " << report_type << LL_ENDL;
return;
}
-
- LLFloaterReporter* f = LLFloaterReg::showTypedInstance<LLFloaterReporter>("reporter", LLSD());
- if (f)
+ LLFloaterReporter* reporter_floater = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
+ if(reporter_floater && reporter_floater->isInVisibleChain())
{
- f->setReportType(report_type);
+ gSavedPerAccountSettings.setBOOL("PreviousScreenshotForReport", FALSE);
+ }
+ reporter_floater = LLFloaterReg::showTypedInstance<LLFloaterReporter>("reporter", LLSD());
+ if (reporter_floater)
+ {
+ reporter_floater->setReportType(report_type);
}
}
// static
void LLFloaterReporter::show(const LLUUID& object_id, const std::string& avatar_name, const LLUUID& experience_id)
{
- LLFloaterReporter* f = LLFloaterReg::showTypedInstance<LLFloaterReporter>("reporter");
-
+ LLFloaterReporter* reporter_floater = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
+ if(reporter_floater && reporter_floater->isInVisibleChain())
+ {
+ gSavedPerAccountSettings.setBOOL("PreviousScreenshotForReport", FALSE);
+ }
+ reporter_floater = LLFloaterReg::showTypedInstance<LLFloaterReporter>("reporter");
if (avatar_name.empty())
{
// Request info for this object
- f->getObjectInfo(object_id);
+ reporter_floater->getObjectInfo(object_id);
}
else
{
- f->setFromAvatarID(object_id);
+ reporter_floater->setFromAvatarID(object_id);
}
if(experience_id.notNull())
{
- f->getExperienceInfo(experience_id);
+ reporter_floater->getExperienceInfo(experience_id);
}
// Need to deselect on close
- f->mDeselectOnClose = TRUE;
-
- f->openFloater();
+ reporter_floater->mDeselectOnClose = TRUE;
}
void LLFloaterReporter::showFromExperience( const LLUUID& experience_id )
{
- LLFloaterReporter* f = LLFloaterReg::showTypedInstance<LLFloaterReporter>("reporter");
- f->getExperienceInfo(experience_id);
+ LLFloaterReporter* reporter_floater = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
+ if(reporter_floater && reporter_floater->isInVisibleChain())
+ {
+ gSavedPerAccountSettings.setBOOL("PreviousScreenshotForReport", FALSE);
+ }
+ reporter_floater = LLFloaterReg::showTypedInstance<LLFloaterReporter>("reporter");
+ reporter_floater->getExperienceInfo(experience_id);
// Need to deselect on close
- f->mDeselectOnClose = TRUE;
-
- f->openFloater();
+ reporter_floater->mDeselectOnClose = TRUE;
}
@@ -769,18 +777,24 @@ void LLFloaterReporter::sendReportViaCaps(std::string url, std::string sshot_url
}
}
-void LLFloaterReporter::takeScreenshot()
+void LLFloaterReporter::takeScreenshot(bool use_prev_screenshot)
{
- const S32 IMAGE_WIDTH = 1024;
- const S32 IMAGE_HEIGHT = 768;
-
- LLPointer<LLImageRaw> raw = new LLImageRaw;
- if( !gViewerWindow->rawSnapshot(raw, IMAGE_WIDTH, IMAGE_HEIGHT, TRUE, FALSE, TRUE, FALSE))
+ gSavedPerAccountSettings.setBOOL("PreviousScreenshotForReport", TRUE);
+ if(!use_prev_screenshot)
{
- LL_WARNS() << "Unable to take screenshot" << LL_ENDL;
- return;
+ std::string screenshot_filename(gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter() + SCREEN_PREV_FILENAME);
+ LLPointer<LLImageBMP> bmp_image = new LLImageBMP;
+ if(bmp_image->encode(mImageRaw, 0.0f))
+ {
+ bmp_image->save(screenshot_filename);
+ }
+ }
+ else
+ {
+ mImageRaw = mPrevImageRaw;
}
- LLPointer<LLImageJ2C> upload_data = LLViewerTextureList::convertToUploadFile(raw);
+
+ LLPointer<LLImageJ2C> upload_data = LLViewerTextureList::convertToUploadFile(mImageRaw);
// create a resource data
mResourceDatap->mInventoryType = LLInventoryType::IT_NONE;
@@ -812,7 +826,7 @@ void LLFloaterReporter::takeScreenshot()
// store in the image list so it doesn't try to fetch from the server
LLPointer<LLViewerFetchedTexture> image_in_list =
LLViewerTextureManager::getFetchedTexture(mResourceDatap->mAssetInfo.mUuid);
- image_in_list->createGLTexture(0, raw, 0, TRUE, LLGLTexture::OTHER);
+ image_in_list->createGLTexture(0, mImageRaw, 0, TRUE, LLGLTexture::OTHER);
// the texture picker then uses that texture
LLTextureCtrl* texture = getChild<LLTextureCtrl>("screenshot");
@@ -822,7 +836,55 @@ void LLFloaterReporter::takeScreenshot()
texture->setDefaultImageAssetID(mResourceDatap->mAssetInfo.mUuid);
texture->setCaption(getString("Screenshot"));
}
+}
+
+void LLFloaterReporter::takeNewSnapshot()
+{
+ childSetEnabled("send_btn", true);
+ mImageRaw = new LLImageRaw;
+ const S32 IMAGE_WIDTH = 1024;
+ const S32 IMAGE_HEIGHT = 768;
+
+ // Take a screenshot, but don't draw this floater.
+ setVisible(FALSE);
+ if( !gViewerWindow->rawSnapshot(mImageRaw, IMAGE_WIDTH, IMAGE_HEIGHT, TRUE, FALSE, TRUE, FALSE))
+ {
+ LL_WARNS() << "Unable to take screenshot" << LL_ENDL;
+ setVisible(TRUE);
+ return;
+ }
+ setVisible(TRUE);
+
+ if(gSavedPerAccountSettings.getBOOL("PreviousScreenshotForReport"))
+ {
+ std::string screenshot_filename(gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter() + SCREEN_PREV_FILENAME);
+ mPrevImageRaw = new LLImageRaw;
+ LLPointer<LLImageBMP> start_image_bmp = new LLImageBMP;
+ if(start_image_bmp->load(screenshot_filename))
+ {
+ if (start_image_bmp->decode(mPrevImageRaw, 0.0f))
+ {
+ LLNotificationsUtil::add("LoadPreviousReportScreenshot", LLSD(), LLSD(), boost::bind(&LLFloaterReporter::onLoadScreenshotDialog,this, _1, _2));
+ return;
+ }
+ }
+ }
+ takeScreenshot();
+}
+
+void LLFloaterReporter::onOpen(const LLSD& key)
+{
+ childSetEnabled("send_btn", false);
+ //Time delay to avoid UI artifacts. MAINT-7067
+ doAfterInterval(boost::bind(&LLFloaterReporter::takeNewSnapshot,this), gSavedSettings.getF32("AbuseReportScreenshotDelay"));
+
+}
+
+void LLFloaterReporter::onLoadScreenshotDialog(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ takeScreenshot(option == 0);
}
void LLFloaterReporter::uploadImage()
@@ -886,6 +948,11 @@ void LLFloaterReporter::setPosBox(const LLVector3d &pos)
getChild<LLUICtrl>("pos_field")->setValue(pos_string);
}
+void LLFloaterReporter::onClose(bool app_quitting)
+{
+ gSavedPerAccountSettings.setBOOL("PreviousScreenshotForReport", app_quitting);
+}
+
// void LLFloaterReporter::setDescription(const std::string& description, LLMeanCollisionData *mcd)
// {
diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h
index 1aff07bd37..decc01be98 100644
--- a/indra/newview/llfloaterreporter.h
+++ b/indra/newview/llfloaterreporter.h
@@ -81,6 +81,8 @@ public:
LLFloaterReporter(const LLSD& key);
/*virtual*/ ~LLFloaterReporter();
/*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
virtual void draw();
void setReportType(EReportType type) { mReportType = type; }
@@ -103,10 +105,14 @@ public:
void setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id);
+ void onLoadScreenshotDialog(const LLSD& notification, const LLSD& response);
+
+ void takeNewSnapshot();
+
private:
static void show(const LLUUID& object_id, const std::string& avatar_name = LLStringUtil::null, const LLUUID& experience_id = LLUUID::null);
- void takeScreenshot();
+ void takeScreenshot(bool use_prev_screenshot = false);
void sendReportViaCaps(std::string url);
void uploadImage();
bool validateReport();
@@ -140,6 +146,9 @@ private:
std::string mDefaultSummary;
LLResourceData* mResourceDatap;
boost::signals2::connection mAvatarNameCacheConnection;
+
+ LLPointer<LLImageRaw> mImageRaw;
+ LLPointer<LLImageRaw> mPrevImageRaw;
};
#endif
diff --git a/indra/newview/llfloaterscriptdebug.cpp b/indra/newview/llfloaterscriptdebug.cpp
index 6c17f62c1e..5f4bc9d301 100644
--- a/indra/newview/llfloaterscriptdebug.cpp
+++ b/indra/newview/llfloaterscriptdebug.cpp
@@ -34,6 +34,7 @@
#include "llrect.h"
#include "llerror.h"
#include "llstring.h"
+#include "llvoavatarself.h"
#include "message.h"
// project include
@@ -105,7 +106,14 @@ void LLFloaterScriptDebug::addScriptLine(const std::string &utf8mesg, const std:
if (objectp)
{
- objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", FTT_LOCAL_FILE, TRUE, LLGLTexture::BOOST_UI));
+ if(objectp->isHUDAttachment())
+ {
+ ((LLViewerObject*)gAgentAvatarp)->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", FTT_LOCAL_FILE, TRUE, LLGLTexture::BOOST_UI));
+ }
+ else
+ {
+ objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", FTT_LOCAL_FILE, TRUE, LLGLTexture::BOOST_UI));
+ }
floater_label = llformat("%s(%.0f, %.0f, %.0f)",
user_name.c_str(),
objectp->getPositionRegion().mV[VX],
diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp
index eae16b9f03..c14bb4e7ae 100644
--- a/indra/newview/llfloaterscriptlimits.cpp
+++ b/indra/newview/llfloaterscriptlimits.cpp
@@ -523,6 +523,8 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content)
LLScrollListCell::Params cell_params;
cell_params.font = LLFontGL::getFontSansSerif();
+ // Start out right justifying numeric displays
+ cell_params.font_halign = LLFontGL::RIGHT;
cell_params.column = "size";
cell_params.value = size;
@@ -532,6 +534,8 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content)
cell_params.value = urls;
item_params.columns.add(cell_params);
+ cell_params.font_halign = LLFontGL::LEFT;
+ // The rest of the columns are text to left justify them
cell_params.column = "name";
cell_params.value = name_buf;
item_params.columns.add(cell_params);
@@ -546,7 +550,7 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content)
cell_params.column = "location";
cell_params.value = has_locations
- ? llformat("<%0.1f,%0.1f,%0.1f>", location_x, location_y, location_z)
+ ? llformat("<%0.0f, %0.0f, %0.0f>", location_x, location_y, location_z)
: "";
item_params.columns.add(cell_params);
@@ -623,13 +627,20 @@ void LLPanelScriptLimitsRegionMemory::setRegionSummary(LLSD content)
if((mParcelMemoryUsed >= 0) && (mParcelMemoryMax >= 0))
{
- S32 parcel_memory_available = mParcelMemoryMax - mParcelMemoryUsed;
-
LLStringUtil::format_map_t args_parcel_memory;
args_parcel_memory["[COUNT]"] = llformat ("%d", mParcelMemoryUsed);
- args_parcel_memory["[MAX]"] = llformat ("%d", mParcelMemoryMax);
- args_parcel_memory["[AVAILABLE]"] = llformat ("%d", parcel_memory_available);
- std::string msg_parcel_memory = LLTrans::getString("ScriptLimitsMemoryUsed", args_parcel_memory);
+ std::string translate_message = "ScriptLimitsMemoryUsedSimple";
+
+ if (0 < mParcelMemoryMax)
+ {
+ S32 parcel_memory_available = mParcelMemoryMax - mParcelMemoryUsed;
+
+ args_parcel_memory["[MAX]"] = llformat ("%d", mParcelMemoryMax);
+ args_parcel_memory["[AVAILABLE]"] = llformat ("%d", parcel_memory_available);
+ translate_message = "ScriptLimitsMemoryUsed";
+ }
+
+ std::string msg_parcel_memory = LLTrans::getString(translate_message, args_parcel_memory);
getChild<LLUICtrl>("memory_used")->setValue(LLSD(msg_parcel_memory));
}
@@ -1061,10 +1072,12 @@ void LLPanelScriptLimitsAttachment::setAttachmentDetails(LLSD content)
element["columns"][0]["column"] = "size";
element["columns"][0]["value"] = llformat("%d", size);
element["columns"][0]["font"] = "SANSSERIF";
+ element["columns"][0]["halign"] = LLFontGL::RIGHT;
element["columns"][1]["column"] = "urls";
element["columns"][1]["value"] = llformat("%d", urls);
element["columns"][1]["font"] = "SANSSERIF";
+ element["columns"][1]["halign"] = LLFontGL::RIGHT;
element["columns"][2]["column"] = "name";
element["columns"][2]["value"] = name;
@@ -1151,14 +1164,20 @@ void LLPanelScriptLimitsAttachment::setAttachmentSummary(LLSD content)
if((mAttachmentMemoryUsed >= 0) && (mAttachmentMemoryMax >= 0))
{
- S32 attachment_memory_available = mAttachmentMemoryMax - mAttachmentMemoryUsed;
-
LLStringUtil::format_map_t args_attachment_memory;
args_attachment_memory["[COUNT]"] = llformat ("%d", mAttachmentMemoryUsed);
- args_attachment_memory["[MAX]"] = llformat ("%d", mAttachmentMemoryMax);
- args_attachment_memory["[AVAILABLE]"] = llformat ("%d", attachment_memory_available);
- std::string msg_attachment_memory = LLTrans::getString("ScriptLimitsMemoryUsed", args_attachment_memory);
- getChild<LLUICtrl>("memory_used")->setValue(LLSD(msg_attachment_memory));
+ std::string translate_message = "ScriptLimitsMemoryUsedSimple";
+
+ if (0 < mAttachmentMemoryMax)
+ {
+ S32 attachment_memory_available = mAttachmentMemoryMax - mAttachmentMemoryUsed;
+
+ args_attachment_memory["[MAX]"] = llformat ("%d", mAttachmentMemoryMax);
+ args_attachment_memory["[AVAILABLE]"] = llformat ("%d", attachment_memory_available);
+ translate_message = "ScriptLimitsMemoryUsed";
+ }
+
+ getChild<LLUICtrl>("memory_used")->setValue(LLTrans::getString(translate_message, args_attachment_memory));
}
if((mAttachmentURLsUsed >= 0) && (mAttachmentURLsMax >= 0))
diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp
index c7218ad9d5..8b3cfa7fd5 100644
--- a/indra/newview/llfloatersidepanelcontainer.cpp
+++ b/indra/newview/llfloatersidepanelcontainer.cpp
@@ -80,6 +80,11 @@ void LLFloaterSidePanelContainer::closeFloater(bool app_quitting)
}
LLFloater::closeFloater(app_quitting);
+
+ if (getInstanceName() == "inventory" && !getKey().isUndefined())
+ {
+ destroy();
+ }
}
LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_name, const LLSD& params)
diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h
index d7ecd52e57..635514e26c 100644
--- a/indra/newview/llfloatersidepanelcontainer.h
+++ b/indra/newview/llfloatersidepanelcontainer.h
@@ -53,6 +53,8 @@ public:
/*virtual*/ void closeFloater(bool app_quitting = false);
+ void cleanup() { destroy(); }
+
LLPanel* openChildPanel(const std::string& panel_name, const LLSD& params);
static void showPanel(const std::string& floater_name, const LLSD& key);
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index b5ba64716d..c0980719bb 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -762,7 +762,8 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL
// hide old preview as the aspect ratio could be wrong
checkAutoSnapshot(previewp, FALSE);
LL_DEBUGS() << "updating thumbnail" << LL_ENDL;
- getPreviewView()->updateSnapshot(TRUE);
+ // Don't update immediately, give window chance to redraw
+ getPreviewView()->updateSnapshot(TRUE, FALSE, 1.f);
if(do_update)
{
LL_DEBUGS() << "Will update controls" << LL_ENDL;
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 987a7449ee..b14b9b7578 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -1177,7 +1177,12 @@ void LLFloaterTools::updateLandImpacts()
S32 rezzed_prims = parcel->getSimWidePrimCount();
S32 total_capacity = parcel->getSimWideMaxPrimCapacity();
-
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if (region)
+ {
+ S32 max_tasks_per_region = (S32)region->getMaxTasks();
+ total_capacity = llmin(total_capacity, max_tasks_per_region);
+ }
std::string remaining_capacity_str = "";
bool show_mesh_cost = gMeshRepo.meshRezEnabled();
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index c67feb8158..c0bd9b1c23 100644
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -546,7 +546,7 @@ void LLFloaterWorldMap::trackAvatar( const LLUUID& avatar_id, const std::string&
// convenience.
if(gAgent.isGodlike())
{
- getChild<LLUICtrl>("spin z")->setValue(LLSD(200.f));
+ getChild<LLUICtrl>("teleport_coordinate_z")->setValue(LLSD(200.f));
}
// Don't re-request info if we already have it or we won't have it in time to teleport
if (mTrackedStatus != LLTracker::TRACKING_AVATAR || name != mTrackedAvatarName)
@@ -1375,7 +1375,7 @@ void LLFloaterWorldMap::teleport()
&& av_tracker.haveTrackingInfo() )
{
pos_global = av_tracker.getGlobalPos();
- pos_global.mdV[VZ] = getChild<LLUICtrl>("spin z")->getValue();
+ pos_global.mdV[VZ] = getChild<LLUICtrl>("teleport_coordinate_z")->getValue();
}
else if ( LLTracker::TRACKING_LANDMARK == tracking_status)
{
diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h
index ae3800e17b..2fb912a930 100644
--- a/indra/newview/llfriendcard.h
+++ b/indra/newview/llfriendcard.h
@@ -37,9 +37,10 @@ class LLFriendCardsManager
: public LLSingleton<LLFriendCardsManager>
, public LLFriendObserver
{
+ LLSINGLETON(LLFriendCardsManager);
+ ~LLFriendCardsManager();
LOG_CLASS(LLFriendCardsManager);
- friend class LLSingleton<LLFriendCardsManager>;
friend class CreateFriendCardCallback;
public:
@@ -97,8 +98,6 @@ public:
private:
typedef boost::function<void()> callback_t;
- LLFriendCardsManager();
- ~LLFriendCardsManager();
/**
diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h
index 26a5924ec3..402bdf6039 100644
--- a/indra/newview/llgesturemgr.h
+++ b/indra/newview/llgesturemgr.h
@@ -51,6 +51,8 @@ public:
class LLGestureMgr : public LLSingleton<LLGestureMgr>, public LLInventoryFetchItemsObserver
{
+ LLSINGLETON(LLGestureMgr);
+ ~LLGestureMgr();
public:
typedef boost::function<void (LLMultiGesture* loaded_gesture)> gesture_loaded_callback_t;
@@ -58,8 +60,6 @@ public:
typedef std::map<LLUUID, LLMultiGesture*> item_map_t;
typedef std::map<LLUUID, gesture_loaded_callback_t> callback_map_t;
- LLGestureMgr();
- ~LLGestureMgr();
void init();
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index e5ce768035..940ef6eea1 100644
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -348,6 +348,8 @@ struct LLRoleActionSet
class LLGroupMgr : public LLSingleton<LLGroupMgr>
{
+ LLSINGLETON(LLGroupMgr);
+ ~LLGroupMgr();
LOG_CLASS(LLGroupMgr);
public:
@@ -369,8 +371,6 @@ public:
public:
- LLGroupMgr();
- ~LLGroupMgr();
void addObserver(LLGroupMgrObserver* observer);
void addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer);
diff --git a/indra/newview/llhints.h b/indra/newview/llhints.h
index ebffe561b9..dd6195a9ce 100644
--- a/indra/newview/llhints.h
+++ b/indra/newview/llhints.h
@@ -29,6 +29,7 @@
#include "llpanel.h"
#include "llnotifications.h"
+#include "llinitdestroyclass.h"
class LLHints : public LLInitClass<LLHints>
diff --git a/indra/newview/llhudmanager.h b/indra/newview/llhudmanager.h
index 9c5d49decd..7782739690 100644
--- a/indra/newview/llhudmanager.h
+++ b/indra/newview/llhudmanager.h
@@ -36,10 +36,10 @@ class LLMessageSystem;
class LLHUDManager : public LLSingleton<LLHUDManager>
{
-public:
- LLHUDManager();
+ LLSINGLETON(LLHUDManager);
~LLHUDManager();
+public:
LLHUDEffect *createViewerEffect(const U8 type, BOOL send_to_sim = TRUE, BOOL originated_here = TRUE);
void updateEffects();
diff --git a/indra/newview/llimagefiltersmanager.h b/indra/newview/llimagefiltersmanager.h
index 4751933065..f1ed3cf1c3 100644
--- a/indra/newview/llimagefiltersmanager.h
+++ b/indra/newview/llimagefiltersmanager.h
@@ -34,6 +34,8 @@
class LLImageFiltersManager : public LLSingleton<LLImageFiltersManager>
{
+ LLSINGLETON(LLImageFiltersManager);
+ ~LLImageFiltersManager();
LOG_CLASS(LLImageFiltersManager);
public:
const std::vector<std::string> getFiltersList() const;
@@ -43,10 +45,7 @@ private:
void loadAllFilters();
void loadFiltersFromDir(const std::string& dir);
- friend class LLSingleton<LLImageFiltersManager>;
/*virtual*/ void initSingleton();
- LLImageFiltersManager();
- ~LLImageFiltersManager();
// List of filters : first is the user friendly localized name, second is the xml file name
std::map<std::string,std::string> mFiltersList;
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 951389b856..2e9332c355 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -2354,7 +2354,13 @@ void LLIncomingCallDialog::onAvatarNameCache(const LLUUID& agent_id,
void LLIncomingCallDialog::onOpen(const LLSD& key)
{
LLCallDialog::onOpen(key);
- make_ui_sound("UISndStartIM");
+
+ if (gSavedSettings.getBOOL("PlaySoundIncomingVoiceCall"))
+ {
+ // play a sound for incoming voice call if respective property is set
+ make_ui_sound("UISndStartIM");
+ }
+
LLStringUtil::format_map_t args;
LLGroupData data;
// if it's a group call, retrieve group name to use it in question
@@ -2697,7 +2703,7 @@ void LLIMMgr::addMessage(
// Logically it would make more sense to reject the session sooner, in another area of the
// code, but the session has to be established inside the server before it can be left.
- if (LLMuteList::getInstance()->isMuted(other_participant_id) && !from_linden)
+ if (LLMuteList::getInstance()->isMuted(other_participant_id, LLMute::flagTextChat) && !from_linden)
{
LL_WARNS() << "Leaving IM session from initiating muted resident " << from << LL_ENDL;
if(!gIMMgr->leaveSession(new_session_id))
@@ -3005,14 +3011,20 @@ void LLIMMgr::inviteToSession(
payload["question_type"] = question_type;
//ignore invites from muted residents
- if (LLMuteList::getInstance()->isMuted(caller_id) && !is_linden)
+ if (!is_linden)
{
- if (voice_invite && "VoiceInviteQuestionDefault" == question_type)
+ if (LLMuteList::getInstance()->isMuted(caller_id, LLMute::flagVoiceChat)
+ && voice_invite && "VoiceInviteQuestionDefault" == question_type)
{
LL_INFOS() << "Rejecting voice call from initiating muted resident " << caller_name << LL_ENDL;
LLIncomingCallDialog::processCallResponse(1, payload);
+ return;
+ }
+ else if (LLMuteList::getInstance()->isMuted(caller_id, LLMute::flagAll & ~LLMute::flagVoiceChat))
+ {
+ LL_INFOS() << "Rejecting session invite from initiating muted resident " << caller_name << LL_ENDL;
+ return;
}
- return;
}
LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(session_id);
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 41a8813acb..da40ac8393 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -33,6 +33,7 @@
#include "lllogchat.h"
#include "llvoicechannel.h"
+#include "llinitdestroyclass.h"
#include "llcoros.h"
#include "lleventcoro.h"
@@ -61,6 +62,7 @@ private:
*/
class LLIMModel : public LLSingleton<LLIMModel>
{
+ LLSINGLETON(LLIMModel);
public:
struct LLIMSession : public boost::signals2::trackable
@@ -151,7 +153,6 @@ public:
};
- LLIMModel();
/** Session id to session object */
std::map<LLUUID, LLIMSession*> mId2SessionMap;
@@ -312,6 +313,7 @@ public:
class LLIMMgr : public LLSingleton<LLIMMgr>
{
+ LLSINGLETON(LLIMMgr);
friend class LLIMModel;
public:
@@ -322,8 +324,6 @@ public:
INVITATION_TYPE_IMMEDIATE = 2
};
- LLIMMgr();
- virtual ~LLIMMgr() {};
// Add a message to a session. The session can keyed to sesion id
// or agent id.
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index eebb6a0384..b7f5424f25 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -41,6 +41,7 @@
#include "llfloateropenobject.h"
#include "llfloaterreg.h"
#include "llfloatermarketplacelistings.h"
+#include "llfloateroutfitphotopreview.h"
#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
#include "llfolderview.h"
@@ -3092,6 +3093,10 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
LLAppearanceMgr::instance().takeOffOutfit( cat->getLinkedUUID() );
return;
}
+ else if ("copyoutfittoclipboard" == action)
+ {
+ copyOutfitToClipboard();
+ }
else if ("purge" == action)
{
purgeItem(model, mUUID);
@@ -3249,6 +3254,39 @@ void LLFolderBridge::gatherMessage(std::string& message, S32 depth, LLError::ELe
}
}
+void LLFolderBridge::copyOutfitToClipboard()
+{
+ std::string text;
+
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(mUUID, cat_array, item_array);
+
+ S32 item_count(0);
+ if( item_array )
+ {
+ item_count = item_array->size();
+ }
+
+ if (item_count)
+ {
+ for (S32 i = 0; i < item_count;)
+ {
+ LLSD uuid =item_array->at(i)->getUUID();
+ LLViewerInventoryItem* item = gInventory.getItem(uuid);
+
+ i++;
+ if (item != NULL)
+ {
+ // Append a newline to all but the last line
+ text += i != item_count ? item->getName() + "\n" : item->getName();
+ }
+ }
+ }
+
+ LLClipboard::instance().copyToClipboard(utf8str_to_wstring(text),0,text.size());
+}
+
void LLFolderBridge::openItem()
{
LL_DEBUGS() << "LLFolderBridge::openItem()" << LL_ENDL;
@@ -3736,12 +3774,22 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
// This is the lost+found folder.
items.push_back(std::string("Empty Lost And Found"));
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(mUUID, cat_array, item_array);
+ // Enable Empty menu item only when there is something to act upon.
+ if (0 == cat_array->size() && 0 == item_array->size())
+ {
+ disabled_items.push_back(std::string("Empty Lost And Found"));
+ }
+
disabled_items.push_back(std::string("New Folder"));
disabled_items.push_back(std::string("New Script"));
disabled_items.push_back(std::string("New Note"));
disabled_items.push_back(std::string("New Gesture"));
disabled_items.push_back(std::string("New Clothes"));
disabled_items.push_back(std::string("New Body Parts"));
+ disabled_items.push_back(std::string("upload_def"));
}
if (favorites == mUUID)
{
@@ -3768,6 +3816,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
disabled_items.push_back(std::string("New Gesture"));
disabled_items.push_back(std::string("New Clothes"));
disabled_items.push_back(std::string("New Body Parts"));
+ disabled_items.push_back(std::string("upload_def"));
}
if (marketplace_listings_id == mUUID)
{
@@ -3780,6 +3829,15 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
{
// This is the trash.
items.push_back(std::string("Empty Trash"));
+
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(mUUID, cat_array, item_array);
+ // Enable Empty menu item only when there is something to act upon.
+ if (0 == cat_array->size() && 0 == item_array->size())
+ {
+ disabled_items.push_back(std::string("Empty Trash"));
+ }
}
else if(isItemInTrash())
{
@@ -3808,6 +3866,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
items.push_back(std::string("New Gesture"));
items.push_back(std::string("New Clothes"));
items.push_back(std::string("New Body Parts"));
+ items.push_back(std::string("upload_def"));
}
}
getClipboardEntries(false, items, disabled_items, flags);
@@ -3829,6 +3888,11 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
}
}
+ if (model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT) == mUUID)
+ {
+ items.push_back(std::string("Copy outfit list to clipboard"));
+ }
+
//Added by aura to force inventory pull on right-click to display folder options correctly. 07-17-06
mCallingCards = mWearables = FALSE;
@@ -4393,7 +4457,7 @@ static BOOL can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_curr
if((inv_type == LLInventoryType::IT_TEXTURE) || (inv_type == LLInventoryType::IT_SNAPSHOT))
{
- return TRUE;
+ return !move_is_into_current_outfit;
}
if (move_is_into_current_outfit && get_is_item_worn(inv_item->getUUID()))
@@ -4448,9 +4512,15 @@ void LLFolderBridge::dropToOutfit(LLInventoryItem* inv_item, BOOL move_is_into_c
{
if((inv_item->getInventoryType() == LLInventoryType::IT_TEXTURE) || (inv_item->getInventoryType() == LLInventoryType::IT_SNAPSHOT))
{
- LLAppearanceMgr::instance().removeOutfitPhoto(mUUID);
- LLPointer<LLInventoryCallback> cb = NULL;
- link_inventory_object(mUUID, LLConstPointer<LLInventoryObject>(inv_item), cb);
+ const LLUUID &my_outifts_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);
+ if(mUUID != my_outifts_id)
+ {
+ LLFloaterOutfitPhotoPreview* photo_preview = LLFloaterReg::showTypedInstance<LLFloaterOutfitPhotoPreview>("outfit_photo_preview", inv_item->getUUID());
+ if(photo_preview)
+ {
+ photo_preview->setOutfitID(mUUID);
+ }
+ }
return;
}
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index df25e01688..b7d8c9d034 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -344,6 +344,7 @@ protected:
BOOL checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& typeToCheck);
void modifyOutfit(BOOL append);
+ void copyOutfitToClipboard();
void determineFolderType();
void dropToFavorites(LLInventoryItem* inv_item);
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index e995c138b4..1433ea36bf 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -40,6 +40,7 @@
#include "llinventorybridge.h"
#include "llviewerfoldertype.h"
#include "llradiogroup.h"
+#include "llstartup.h"
// linden library includes
#include "llclipboard.h"
@@ -132,8 +133,10 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const
}
// when applying a filter, matching folders get their contents downloaded first
+ // but make sure we are not interfering with pre-download
if (isNotDefault()
- && !gInventory.isCategoryComplete(folder_id))
+ && !gInventory.isCategoryComplete(folder_id)
+ && LLStartUp::getStartupState() > STATE_WEARABLES_WAIT)
{
LLInventoryModelBackgroundFetch::instance().start(folder_id);
}
@@ -307,7 +310,11 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent
if (is_hidden_if_empty)
{
// Force the fetching of those folders so they are hidden if they really are empty...
- gInventory.fetchDescendentsOf(object_id);
+ // But don't interfere with startup download
+ if (LLStartUp::getStartupState() > STATE_WEARABLES_WAIT)
+ {
+ gInventory.fetchDescendentsOf(object_id);
+ }
LLInventoryModel::cat_array_t* cat_array = NULL;
LLInventoryModel::item_array_t* item_array = NULL;
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index d8f019374e..f04d6cc753 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -48,7 +48,6 @@
#include "llavataractions.h"
#include "llclipboard.h"
#include "lldonotdisturbnotificationstorage.h"
-#include "llfloaterinventory.h"
#include "llfloatersidepanelcontainer.h"
#include "llfocusmgr.h"
#include "llfolderview.h"
@@ -752,36 +751,13 @@ void show_item_original(const LLUUID& item_uuid)
void reset_inventory_filter()
{
- //inventory floater
- bool floater_inventory_visible = false;
-
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
+ LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ if (sidepanel_inventory)
{
- LLFloaterInventory* floater_inventory = dynamic_cast<LLFloaterInventory*>(*iter);
- if (floater_inventory)
+ LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
+ if (main_inventory)
{
- LLPanelMainInventory* main_inventory = floater_inventory->getMainInventoryPanel();
-
main_inventory->onFilterEdit("");
-
- if(floater_inventory->getVisible())
- {
- floater_inventory_visible = true;
- }
- }
- }
-
- if(!floater_inventory_visible)
- {
- LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
- if (sidepanel_inventory)
- {
- LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
- if (main_inventory)
- {
- main_inventory->onFilterEdit("");
- }
}
}
}
diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp
index 013a5a7629..495180f087 100644
--- a/indra/newview/llinventoryicon.cpp
+++ b/indra/newview/llinventoryicon.cpp
@@ -46,8 +46,7 @@ struct IconEntry : public LLDictionaryEntry
class LLIconDictionary : public LLSingleton<LLIconDictionary>,
public LLDictionary<LLInventoryType::EIconName, IconEntry>
{
-public:
- LLIconDictionary();
+ LLSINGLETON(LLIconDictionary);
};
typedef LLPointer<LLUIImage> LLUIImagePtr;
diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp
index 36e1cc97d1..1dc1aa395e 100644
--- a/indra/newview/llinventoryitemslist.cpp
+++ b/indra/newview/llinventoryitemslist.cpp
@@ -45,7 +45,7 @@ LLInventoryItemsList::Params::Params()
LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p)
: LLFlatListViewEx(p)
-, mNeedsRefresh(false)
+, mRefreshState(REFRESH_COMPLETE)
, mForceRefresh(false)
{
// TODO: mCommitOnSelectionChange is set to "false" in LLFlatListView
@@ -66,13 +66,13 @@ LLInventoryItemsList::~LLInventoryItemsList()
void LLInventoryItemsList::refreshList(const LLInventoryModel::item_array_t item_array)
{
- getIDs().clear();
+ 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;
+ mRefreshState = REFRESH_ALL;
}
boost::signals2::connection LLInventoryItemsList::setRefreshCompleteCallback(const commit_signal_t::slot_type& cb)
@@ -113,9 +113,9 @@ void LLInventoryItemsList::updateSelection()
void LLInventoryItemsList::doIdle()
{
- if (!mNeedsRefresh) return;
+ if (mRefreshState == REFRESH_COMPLETE) return;
- if (isInVisibleChain() || mForceRefresh)
+ if (isInVisibleChain() || mForceRefresh )
{
refresh();
@@ -137,54 +137,130 @@ LLTrace::BlockTimerStatHandle FTM_INVENTORY_ITEMS_REFRESH("Inventory List Refres
void LLInventoryItemsList::refresh()
{
- LL_RECORD_BLOCK_TIME(FTM_INVENTORY_ITEMS_REFRESH);
- static const unsigned ADD_LIMIT = 20;
-
- uuid_vec_t added_items;
- uuid_vec_t removed_items;
-
- computeDifference(getIDs(), added_items, removed_items);
-
- bool add_limit_exceeded = false;
- unsigned int nadded = 0;
-
- uuid_vec_t::const_iterator it = added_items.begin();
- for( ; added_items.end() != it; ++it)
- {
- if(nadded >= ADD_LIMIT)
- {
- add_limit_exceeded = true;
- break;
- }
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- // Do not rearrange items on each adding, let's do that on filter call
- llassert(item);
- if (item)
- {
- addNewItem(item, false);
- ++nadded;
- }
- }
-
- it = removed_items.begin();
- for( ; removed_items.end() != it; ++it)
- {
- // don't filter items right away
- removeItemByUUID(*it, false);
- }
-
- // Filter, rearrange and notify parent about shape changes
- filterItems();
-
- bool needs_refresh = add_limit_exceeded;
- setNeedsRefresh(needs_refresh);
- setForceRefresh(needs_refresh);
-
- // After list building completed, select items that had been requested to select before list was build
- if(!needs_refresh)
- {
- updateSelection();
- }
+ LL_RECORD_BLOCK_TIME(FTM_INVENTORY_ITEMS_REFRESH);
+
+ switch (mRefreshState)
+ {
+ case REFRESH_ALL:
+ {
+ mAddedItems.clear();
+ mRemovedItems.clear();
+ computeDifference(getIDs(), mAddedItems, mRemovedItems);
+ if (mRemovedItems.size() > 0)
+ {
+ mRefreshState = REFRESH_LIST_ERASE;
+ }
+ else if (mAddedItems.size() > 0)
+ {
+ mRefreshState = REFRESH_LIST_APPEND;
+ }
+ else
+ {
+ mRefreshState = REFRESH_LIST_SORT;
+ }
+
+ rearrangeItems();
+ notifyParentItemsRectChanged();
+ break;
+ }
+ case REFRESH_LIST_ERASE:
+ {
+ uuid_vec_t::const_iterator it = mRemovedItems.begin();
+ for (; mRemovedItems.end() != it; ++it)
+ {
+ // don't filter items right away
+ removeItemByUUID(*it, false);
+ }
+ mRemovedItems.clear();
+ mRefreshState = REFRESH_LIST_SORT; // fix visibility and arrange
+ break;
+ }
+ case REFRESH_LIST_APPEND:
+ {
+ static const unsigned ADD_LIMIT = 25; // Note: affects perfomance
+
+ unsigned int nadded = 0;
+
+ // form a list to add
+ uuid_vec_t::iterator it = mAddedItems.begin();
+ pairs_list_t panel_list;
+ while(mAddedItems.size() > 0 && nadded < ADD_LIMIT)
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*it);
+ llassert(item);
+ if (item)
+ {
+ LLPanel *list_item = createNewItem(item);
+ if (list_item)
+ {
+ item_pair_t* new_pair = new item_pair_t(list_item, item->getUUID());
+ panel_list.push_back(new_pair);
+ ++nadded;
+ }
+ }
+
+ it = mAddedItems.erase(it);
+ }
+
+ // add the list
+ // Note: usually item pairs are sorted with std::sort, but we are calling
+ // this function on idle and pairs' list can take a lot of time to sort
+ // through, so we are sorting items into list while adding them
+ addItemPairs(panel_list, false);
+
+ // update visibility of items in the list
+ std::string cur_filter = getFilterSubString();
+ LLStringUtil::toUpper(cur_filter);
+ LLSD action;
+ action.with("match_filter", cur_filter);
+
+ pairs_const_iterator_t pair_it = panel_list.begin();
+ for (; pair_it != panel_list.end(); ++pair_it)
+ {
+ item_pair_t* item_pair = *pair_it;
+ if (item_pair->first->getParent() != NULL)
+ {
+ updateItemVisibility(item_pair->first, action);
+ }
+ }
+
+ rearrangeItems();
+ notifyParentItemsRectChanged();
+
+ if (mAddedItems.size() > 0)
+ {
+ mRefreshState = REFRESH_LIST_APPEND;
+ }
+ else
+ {
+ // Note: while we do sort and check visibility at REFRESH_LIST_APPEND, update
+ // could have changed something about existing items so redo checks for all items.
+ mRefreshState = REFRESH_LIST_SORT;
+ }
+ break;
+ }
+ case REFRESH_LIST_SORT:
+ {
+ // Filter, sort, rearrange and notify parent about shape changes
+ filterItems();
+
+ if (mAddedItems.size() == 0)
+ {
+ // After list building completed, select items that had been requested to select before list was build
+ updateSelection();
+ mRefreshState = REFRESH_COMPLETE;
+ }
+ else
+ {
+ mRefreshState = REFRESH_LIST_APPEND;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ setForceRefresh(mRefreshState != REFRESH_COMPLETE);
}
void LLInventoryItemsList::computeDifference(
@@ -204,24 +280,15 @@ void LLInventoryItemsList::computeDifference(
LLCommonUtils::computeDifference(vnew, vcur, vadded, vremoved);
}
-void LLInventoryItemsList::addNewItem(LLViewerInventoryItem* item, bool rearrange /*= true*/)
+LLPanel* LLInventoryItemsList::createNewItem(LLViewerInventoryItem* item)
{
- if (!item)
- {
- LL_WARNS() << "No inventory item. Couldn't create flat list item." << LL_ENDL;
- 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)
- {
- LL_WARNS() << "Couldn't add flat list item." << LL_ENDL;
- llassert(is_item_added);
- }
+ if (!item)
+ {
+ LL_WARNS() << "No inventory item. Couldn't create flat list item." << LL_ENDL;
+ llassert(item != NULL);
+ return NULL;
+ }
+ return LLPanelInventoryListItemBase::create(item);
}
// EOF
diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h
index 1aa230df99..fe05c2ed7c 100644
--- a/indra/newview/llinventoryitemslist.h
+++ b/indra/newview/llinventoryitemslist.h
@@ -51,9 +51,9 @@ public:
/**
* Let list know items need to be refreshed in next doIdle()
*/
- void setNeedsRefresh(bool needs_refresh){ mNeedsRefresh = needs_refresh; }
+ void setNeedsRefresh(bool needs_refresh){ mRefreshState = needs_refresh ? REFRESH_ALL : REFRESH_COMPLETE; }
- bool getNeedsRefresh(){ return mNeedsRefresh; }
+ U32 getNeedsRefresh(){ return mRefreshState; }
/**
* Sets the flag indicating that the list needs to be refreshed even if it is
@@ -71,7 +71,7 @@ public:
* This is needed for example to filter items of the list hidden by closed
* accordion tab.
*/
- void doIdle(); // Real idle routine
+ virtual void doIdle(); // Real idle routine
static void idle(void* user_data); // static glue to doIdle()
protected:
@@ -94,17 +94,29 @@ protected:
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);
+ * Create panel(item) from inventory item
+ */
+ virtual LLPanel* createNewItem(LLViewerInventoryItem* item);
+
+protected:
+ enum ERefreshStates
+ {
+ REFRESH_COMPLETE = 0,
+ REFRESH_LIST_SORT,
+ REFRESH_LIST_APPEND,
+ REFRESH_LIST_ERASE,
+ REFRESH_ALL
+ };
+
+ ERefreshStates mRefreshState;
private:
uuid_vec_t mIDs; // IDs of items that were added in refreshList().
// Will be used in refresh() to determine added and removed ids
uuid_vec_t mSelectTheseIDs; // IDs that will be selected if list is not loaded till now
-
- bool mNeedsRefresh;
+ uuid_vec_t mAddedItems;
+ uuid_vec_t mRemovedItems;
bool mForceRefresh;
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 503fa28a33..287fa4c45b 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -515,6 +515,42 @@ const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType prefe
return findCategoryUUIDForTypeInRoot(preferred_type, create_folder, gInventory.getRootFolderID());
}
+const LLUUID LLInventoryModel::findUserDefinedCategoryUUIDForType(LLFolderType::EType preferred_type)
+{
+ LLUUID cat_id;
+ switch (preferred_type)
+ {
+ case LLFolderType::FT_OBJECT:
+ {
+ cat_id = LLUUID(gSavedPerAccountSettings.getString("ModelUploadFolder"));
+ break;
+ }
+ case LLFolderType::FT_TEXTURE:
+ {
+ cat_id = LLUUID(gSavedPerAccountSettings.getString("TextureUploadFolder"));
+ break;
+ }
+ case LLFolderType::FT_SOUND:
+ {
+ cat_id = LLUUID(gSavedPerAccountSettings.getString("SoundUploadFolder"));
+ break;
+ }
+ case LLFolderType::FT_ANIMATION:
+ {
+ cat_id = LLUUID(gSavedPerAccountSettings.getString("AnimationUploadFolder"));
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (cat_id.isNull() || !getCategory(cat_id))
+ {
+ cat_id = findCategoryUUIDForTypeInRoot(preferred_type, true, getRootFolderID());
+ }
+ return cat_id;
+}
+
const LLUUID LLInventoryModel::findLibraryCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder)
{
return findCategoryUUIDForTypeInRoot(preferred_type, create_folder, gInventory.getLibraryRootFolderID());
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index 826d1f880d..dee1769172 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -287,6 +287,9 @@ public:
// will search in the user's library folder instead of "My Inventory"
const LLUUID findLibraryCategoryUUIDForType(LLFolderType::EType preferred_type,
bool create_folder = true);
+ // Returns user specified category for uploads, returns default id if there are no
+ // user specified one or it does not exist, creates default category if it is missing.
+ const LLUUID findUserDefinedCategoryUUIDForType(LLFolderType::EType preferred_type);
// Get whatever special folder this object is a child of, if any.
const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const;
diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h
index 19fbfc2ed3..00d2908c1b 100644
--- a/indra/newview/llinventorymodelbackgroundfetch.h
+++ b/indra/newview/llinventorymodelbackgroundfetch.h
@@ -43,9 +43,9 @@
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLInventoryModelBackgroundFetch : public LLSingleton<LLInventoryModelBackgroundFetch>
{
-public:
- LLInventoryModelBackgroundFetch();
+ LLSINGLETON(LLInventoryModelBackgroundFetch);
~LLInventoryModelBackgroundFetch();
+public:
// Start and stop background breadth-first fetching of inventory contents.
// This gets triggered when performing a filter-search.
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index ce8705b7ac..4427f32de9 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -656,7 +656,7 @@ void LLInventoryCategoriesObserver::changed(U32 mask)
}
}
-bool LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t cb)
+bool LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t cb, bool init_name_hash)
{
S32 version = LLViewerInventoryCategory::VERSION_UNKNOWN;
S32 current_num_known_descendents = LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN;
@@ -694,8 +694,15 @@ bool LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t
if (can_be_added)
{
- mCategoryMap.insert(category_map_value_t(
- cat_id,LLCategoryData(cat_id, cb, version, current_num_known_descendents)));
+ if(init_name_hash)
+ {
+ LLMD5 item_name_hash = gInventory.hashDirectDescendentNames(cat_id);
+ mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, cb, version, current_num_known_descendents,item_name_hash)));
+ }
+ else
+ {
+ mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, cb, version, current_num_known_descendents)));
+ }
}
return can_be_added;
@@ -718,6 +725,18 @@ LLInventoryCategoriesObserver::LLCategoryData::LLCategoryData(
mItemNameHash.finalize();
}
+LLInventoryCategoriesObserver::LLCategoryData::LLCategoryData(
+ const LLUUID& cat_id, callback_t cb, S32 version, S32 num_descendents, LLMD5 name_hash)
+
+ : mCatID(cat_id)
+ , mCallback(cb)
+ , mVersion(version)
+ , mDescendentsCount(num_descendents)
+ , mIsNameHashInitialized(true)
+ , mItemNameHash(name_hash)
+{
+}
+
void LLScrollOnRenameObserver::changed(U32 mask)
{
if (mask & LLInventoryObserver::LABEL)
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index 8cf6a6bdab..36d8ee3f59 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -267,14 +267,14 @@ public:
* @return "true" if category was added, "false" if it could
* not be found.
*/
- bool addCategory(const LLUUID& cat_id, callback_t cb);
+ bool addCategory(const LLUUID& cat_id, callback_t cb, bool init_name_hash = false);
void removeCategory(const LLUUID& cat_id);
protected:
struct LLCategoryData
{
LLCategoryData(const LLUUID& cat_id, callback_t cb, S32 version, S32 num_descendents);
-
+ LLCategoryData(const LLUUID& cat_id, callback_t cb, S32 version, S32 num_descendents, LLMD5 name_hash);
callback_t mCallback;
S32 mVersion;
S32 mDescendentsCount;
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index f5dcbf838d..bd15ba4975 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -34,7 +34,6 @@
#include "llappearancemgr.h"
#include "llavataractions.h"
#include "llclipboard.h"
-#include "llfloaterinventory.h"
#include "llfloaterreg.h"
#include "llfloatersidepanelcontainer.h"
#include "llfolderview.h"
@@ -168,7 +167,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
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, this));
-
+ mCommitCallbackRegistrar.add("Inventory.FileUploadLocation", boost::bind(&LLInventoryPanel::fileUploadLocation, this, _2));
}
LLFolderView * LLInventoryPanel::createFolderRoot(LLUUID root_id )
@@ -1191,6 +1190,27 @@ bool LLInventoryPanel::beginIMSession()
return true;
}
+void LLInventoryPanel::fileUploadLocation(const LLSD& userdata)
+{
+ const std::string param = userdata.asString();
+ if (param == "model")
+ {
+ gSavedPerAccountSettings.setString("ModelUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
+ }
+ else if (param == "texture")
+ {
+ gSavedPerAccountSettings.setString("TextureUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
+ }
+ else if (param == "sound")
+ {
+ gSavedPerAccountSettings.setString("SoundUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
+ }
+ else if (param == "animation")
+ {
+ gSavedPerAccountSettings.setString("AnimationUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
+ }
+}
+
bool LLInventoryPanel::attachObject(const LLSD& userdata)
{
// Copy selected item UUIDs to a vector.
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index b69edd8b93..5cb9dde47a 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -201,6 +201,7 @@ public:
void doToSelected(const LLSD& userdata);
void doCreate(const LLSD& userdata);
bool beginIMSession();
+ void fileUploadLocation(const LLSD& userdata);
bool attachObject(const LLSD& userdata);
static void idle(void* user_data);
diff --git a/indra/newview/lllocationhistory.h b/indra/newview/lllocationhistory.h
index 9fef42c5df..1cecbabd3b 100644
--- a/indra/newview/lllocationhistory.h
+++ b/indra/newview/lllocationhistory.h
@@ -103,6 +103,7 @@ public:
class LLLocationHistory: public LLSingleton<LLLocationHistory>
{
+ LLSINGLETON(LLLocationHistory);
LOG_CLASS(LLLocationHistory);
public:
@@ -117,7 +118,6 @@ public:
typedef boost::function<void(EChangeType event)> history_changed_callback_t;
typedef boost::signals2::signal<void(EChangeType event)> history_changed_signal_t;
- LLLocationHistory();
void addItem(const LLLocationHistoryItem& item);
bool touchItem(const LLLocationHistoryItem& item);
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 485d4677b1..b9194c6c67 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -132,15 +132,9 @@ void append_to_last_message(std::list<LLSD>& messages, const std::string& line)
class LLLogChatTimeScanner: public LLSingleton<LLLogChatTimeScanner>
{
-public:
- LLLogChatTimeScanner()
- {
- // Note, date/time facets will be destroyed by string streams
- mDateStream.imbue(std::locale(mDateStream.getloc(), new date_input_facet(DATE_FORMAT)));
- mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_facet(TIME_FORMAT)));
- mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_input_facet(DATE_FORMAT)));
- }
+ LLSINGLETON(LLLogChatTimeScanner);
+public:
date getTodayPacificDate()
{
typedef boost::date_time::local_adjustor<ptime, -8, no_dst> pst;
@@ -205,6 +199,15 @@ private:
std::stringstream mTimeStream;
};
+inline
+LLLogChatTimeScanner::LLLogChatTimeScanner()
+{
+ // Note, date/time facets will be destroyed by string streams
+ mDateStream.imbue(std::locale(mDateStream.getloc(), new date_input_facet(DATE_FORMAT)));
+ mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_facet(TIME_FORMAT)));
+ mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_input_facet(DATE_FORMAT)));
+}
+
LLLogChat::save_history_signal_t * LLLogChat::sSaveHistorySignal = NULL;
std::map<LLUUID,LLLoadHistoryThread *> LLLogChat::sLoadHistoryThreads;
diff --git a/indra/newview/llloginhandler.cpp b/indra/newview/llloginhandler.cpp
index 39f3c0f113..eca34c0d4d 100644
--- a/indra/newview/llloginhandler.cpp
+++ b/indra/newview/llloginhandler.cpp
@@ -168,7 +168,6 @@ LLPointer<LLCredential> LLLoginHandler::loadSavedUserLoginInfo()
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);
}
diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h
index c6773bbf68..282ddc1cea 100644
--- a/indra/newview/lllogininstance.h
+++ b/indra/newview/lllogininstance.h
@@ -40,12 +40,12 @@ class LLUpdaterService;
// negotiate user authentication attempts.
class LLLoginInstance : public LLSingleton<LLLoginInstance>
{
+ LLSINGLETON(LLLoginInstance);
+ ~LLLoginInstance();
+
public:
class Disposable;
- LLLoginInstance();
- ~LLLoginInstance();
-
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.
diff --git a/indra/newview/llmainlooprepeater.h b/indra/newview/llmainlooprepeater.h
index f84c0ca94c..2ec3a74e4a 100644
--- a/indra/newview/llmainlooprepeater.h
+++ b/indra/newview/llmainlooprepeater.h
@@ -43,9 +43,8 @@
class LLMainLoopRepeater:
public LLSingleton<LLMainLoopRepeater>
{
+ LLSINGLETON(LLMainLoopRepeater);
public:
- LLMainLoopRepeater(void);
-
// Start the repeater service.
void start(void);
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index 3a0f96cd37..7bd5e4cba2 100644
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -1157,6 +1157,9 @@ BOOL LLManipRotate::updateVisiblity()
BOOL visible = FALSE;
+ //Assume that UI scale factor is equivalent for X and Y axis
+ F32 ui_scale_factor = LLUI::getScaleFactor().mV[VX];
+
LLVector3 center = gAgent.getPosAgentFromGlobal( mRotationCenter );
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
@@ -1166,6 +1169,7 @@ BOOL LLManipRotate::updateVisiblity()
mRadiusMeters = RADIUS_PIXELS / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
mRadiusMeters /= gAgentCamera.mHUDCurZoom;
+ mRadiusMeters *= ui_scale_factor;
mCenterToProfilePlaneMag = mRadiusMeters * mRadiusMeters / mCenterToCamMag;
mCenterToProfilePlane = -mCenterToProfilePlaneMag * mCenterToCamNorm;
@@ -1205,6 +1209,7 @@ BOOL LLManipRotate::updateVisiblity()
F32 fraction_of_fov = RADIUS_PIXELS / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView(); // radians
mRadiusMeters = z_dist * tan(apparent_angle);
+ mRadiusMeters *= ui_scale_factor;
mCenterToProfilePlaneMag = mRadiusMeters * mRadiusMeters / mCenterToCamMag;
mCenterToProfilePlane = -mCenterToProfilePlaneMag * mCenterToCamNorm;
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index 3cbe742e3c..8b2ac4f303 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -228,12 +228,16 @@ void LLManipScale::render()
const F32 BOX_HANDLE_BASE_SIZE = 50.0f; // box size in pixels = BOX_HANDLE_BASE_SIZE * BOX_HANDLE_BASE_FACTOR
const F32 BOX_HANDLE_BASE_FACTOR = 0.2f;
+ //Assume that UI scale factor is equivalent for X and Y axis
+ F32 ui_scale_factor = LLUI::getScaleFactor().mV[VX];
+
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
for (S32 i = 0; i < NUM_MANIPULATORS; i++)
{
mBoxHandleSize[i] = BOX_HANDLE_BASE_SIZE * BOX_HANDLE_BASE_FACTOR / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
mBoxHandleSize[i] /= gAgentCamera.mHUDCurZoom;
+ mBoxHandleSize[i] *= ui_scale_factor;
}
}
else
@@ -266,6 +270,7 @@ void LLManipScale::render()
// range == zero
mBoxHandleSize[i] = BOX_HANDLE_BASE_FACTOR;
}
+ mBoxHandleSize[i] *= ui_scale_factor;
}
}
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index 3975d3980b..785022792b 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -1857,6 +1857,9 @@ void LLManipTranslate::renderTranslationHandles()
mArrowLengthMeters = 1.0f;
}
}
+ //Assume that UI scale factor is equivalent for X and Y axis
+ F32 ui_scale_factor = LLUI::getScaleFactor().mV[VX];
+ mArrowLengthMeters *= ui_scale_factor;
mPlaneManipOffsetMeters = mArrowLengthMeters * 1.8f;
mGridSizeMeters = gSavedSettings.getF32("GridDrawSize");
diff --git a/indra/newview/llmarketplacefunctions.h b/indra/newview/llmarketplacefunctions.h
index 9d795c6ced..ec312baca3 100644
--- a/indra/newview/llmarketplacefunctions.h
+++ b/indra/newview/llmarketplacefunctions.h
@@ -86,11 +86,10 @@ namespace MarketplaceFetchCodes
class LLMarketplaceInventoryImporter
: public LLSingleton<LLMarketplaceInventoryImporter>
{
+ LLSINGLETON(LLMarketplaceInventoryImporter);
public:
static void update();
-
- LLMarketplaceInventoryImporter();
-
+
typedef boost::signals2::signal<void (bool)> status_changed_signal_t;
typedef boost::signals2::signal<void (U32, const LLSD&)> status_report_signal_t;
@@ -181,10 +180,11 @@ class LLSLMDeleteListingsResponder;
class LLMarketplaceData
: public LLSingleton<LLMarketplaceData>
{
- friend class LLSingleton < LLMarketplaceData > ;
+ LLSINGLETON(LLMarketplaceData);
+ virtual ~LLMarketplaceData();
public:
- friend class LLSLMGetMerchantResponder;
+ friend class LLSLMGetMerchantResponder;
friend class LLSLMGetListingsResponder;
friend class LLSLMCreateListingsResponder;
friend class LLSLMGetListingResponder;
@@ -242,9 +242,6 @@ public:
void decrementValidationWaiting(const LLUUID& folder_id, S32 count = 1);
private:
- LLMarketplaceData();
- virtual ~LLMarketplaceData();
-
// Modify Marketplace data set : each method returns true if the function succeeds, false if error
// Used internally only by SLM Responders when data are received from the SLM Server
bool addListing(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, bool is_listed, const std::string& edit_url, S32 count);
diff --git a/indra/newview/llmaterialmgr.h b/indra/newview/llmaterialmgr.h
index 36dd0904b6..60b58d17de 100644
--- a/indra/newview/llmaterialmgr.h
+++ b/indra/newview/llmaterialmgr.h
@@ -38,9 +38,7 @@ class LLViewerRegion;
class LLMaterialMgr : public LLSingleton<LLMaterialMgr>
{
- friend class LLSingleton<LLMaterialMgr>;
-protected:
- LLMaterialMgr();
+ LLSINGLETON(LLMaterialMgr);
virtual ~LLMaterialMgr();
public:
diff --git a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp
index 8879cfd7fb..63d97f6ac2 100644
--- a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp
+++ b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp
@@ -41,8 +41,7 @@
#include "llpathfindingnavmeshstatus.h"
#include "llviewerregion.h"
-LLMenuOptionPathfindingRebakeNavmesh::LLMenuOptionPathfindingRebakeNavmesh()
- : LLSingleton<LLMenuOptionPathfindingRebakeNavmesh>(),
+LLMenuOptionPathfindingRebakeNavmesh::LLMenuOptionPathfindingRebakeNavmesh() :
mIsInitialized(false),
mCanRebakeRegion(false),
mRebakeNavMeshMode(kRebakeNavMesh_Default),
diff --git a/indra/newview/llmenuoptionpathfindingrebakenavmesh.h b/indra/newview/llmenuoptionpathfindingrebakenavmesh.h
index 7b1d2873ba..649a387dd3 100644
--- a/indra/newview/llmenuoptionpathfindingrebakenavmesh.h
+++ b/indra/newview/llmenuoptionpathfindingrebakenavmesh.h
@@ -37,6 +37,8 @@ class LLPathfindingNavMeshStatus;
class LLMenuOptionPathfindingRebakeNavmesh : public LLSingleton<LLMenuOptionPathfindingRebakeNavmesh>
{
+ LLSINGLETON(LLMenuOptionPathfindingRebakeNavmesh);
+ virtual ~LLMenuOptionPathfindingRebakeNavmesh();
LOG_CLASS(LLMenuOptionPathfindingRebakeNavmesh);
public:
@@ -49,8 +51,6 @@ public:
kRebakeNavMesh_Default = kRebakeNavMesh_NotAvailable
} ERebakeNavMeshMode;
- LLMenuOptionPathfindingRebakeNavmesh();
- virtual ~LLMenuOptionPathfindingRebakeNavmesh();
void initialize();
void quit();
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 9dacae2c4e..1a533dace7 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -2030,8 +2030,8 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
LLSD result;
LLSD res;
- result["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
- result["texture_folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE);
+ result["folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_OBJECT);
+ result["texture_folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE);
result["asset_type"] = "mesh";
result["inventory_type"] = "object";
result["description"] = "(No Description)";
@@ -3536,11 +3536,11 @@ void LLMeshRepository::notifyLoadedMeshes()
// Handle addition of texture, if any.
if ( data.mResponse.has("new_texture_folder_id") )
{
- const LLUUID& folder_id = data.mResponse["new_texture_folder_id"].asUUID();
+ const LLUUID& new_folder_id = data.mResponse["new_texture_folder_id"].asUUID();
- if ( folder_id.notNull() )
+ if ( new_folder_id.notNull() )
{
- LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE);
+ LLUUID parent_id = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE);
std::string name;
// Check if the server built a different name for the texture folder
@@ -3555,7 +3555,7 @@ void LLMeshRepository::notifyLoadedMeshes()
// Add the category to the internal representation
LLPointer<LLViewerInventoryCategory> cat =
- new LLViewerInventoryCategory(folder_id, parent_id,
+ new LLViewerInventoryCategory(new_folder_id, parent_id,
LLFolderType::FT_NONE, name, gAgent.getID());
cat->setVersion(LLViewerInventoryCategory::VERSION_UNKNOWN);
diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp
index 01cf68bcda..0f70c9d13f 100644
--- a/indra/newview/llmutelist.cpp
+++ b/indra/newview/llmutelist.cpp
@@ -47,6 +47,7 @@
#include "pipeline.h"
#include <boost/tokenizer.hpp>
+#include <boost/bind.hpp>
#include "lldispatcher.h"
#include "llxfermanager.h"
@@ -56,6 +57,7 @@
#include "llworld.h" //for particle system banning
#include "llimview.h"
#include "llnotifications.h"
+#include "llviewercontrol.h"
#include "llviewerobjectlist.h"
#include "lltrans.h"
@@ -146,22 +148,6 @@ std::string LLMute::getDisplayType() const
}
}
-
-/* static */
-LLMuteList* LLMuteList::getInstance()
-{
- // Register callbacks at the first time that we find that the message system has been created.
- static BOOL registered = FALSE;
- if( !registered && gMessageSystem != NULL)
- {
- registered = TRUE;
- // Register our various callbacks
- gMessageSystem->setHandlerFuncFast(_PREHASH_MuteListUpdate, processMuteListUpdate);
- gMessageSystem->setHandlerFuncFast(_PREHASH_UseCachedMuteList, processUseCachedMuteList);
- }
- return LLSingleton<LLMuteList>::getInstance(); // Call the "base" implementation.
-}
-
//-----------------------------------------------------------------------------
// LLMuteList()
//-----------------------------------------------------------------------------
@@ -169,6 +155,18 @@ LLMuteList::LLMuteList() :
mIsLoaded(FALSE)
{
gGenericDispatcher.addHandler("emptymutelist", &sDispatchEmptyMuteList);
+
+ // Register our callbacks. We may be constructed before gMessageSystem, so
+ // use callWhenReady() to register them as soon as gMessageSystem becomes
+ // available.
+ // When using bind(), must be explicit about default arguments such as
+ // that last NULL.
+ gMessageSystem.callWhenReady(boost::bind(&LLMessageSystem::setHandlerFuncFast, _1,
+ _PREHASH_MuteListUpdate, processMuteListUpdate,
+ static_cast<void**>(NULL)));
+ gMessageSystem.callWhenReady(boost::bind(&LLMessageSystem::setHandlerFuncFast, _1,
+ _PREHASH_UseCachedMuteList, processUseCachedMuteList,
+ static_cast<void**>(NULL)));
}
//-----------------------------------------------------------------------------
@@ -231,6 +229,16 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
return FALSE;
}
+ S32 mute_list_limit = gSavedSettings.getS32("MuteListLimit");
+ if (getMutes().size() >= mute_list_limit)
+ {
+ LL_WARNS() << "Mute limit is reached; ignored" << LL_ENDL;
+ LLSD args;
+ args["MUTE_LIMIT"] = mute_list_limit;
+ LLNotifications::instance().add(LLNotification::Params("MuteLimitReached").substitutions(args));
+ return FALSE;
+ }
+
if (mute.mType == LLMute::BY_NAME)
{
// Can't mute empty string by name
diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h
index 4e7b6ee880..4ceddc97fd 100644
--- a/indra/newview/llmutelist.h
+++ b/indra/newview/llmutelist.h
@@ -71,6 +71,8 @@ public:
class LLMuteList : public LLSingleton<LLMuteList>
{
+ LLSINGLETON(LLMuteList);
+ ~LLMuteList();
public:
// reasons for auto-unmuting a resident
enum EAutoReason
@@ -81,13 +83,6 @@ public:
AR_COUNT // enum count
};
- LLMuteList();
- ~LLMuteList();
-
- // Implemented locally so that we can perform some delayed initialization.
- // Callers should be careful to call this one and not LLSingleton<LLMuteList>::getInstance()
- // which would circumvent that mechanism. -MG
- static LLMuteList* getInstance();
void addObserver(LLMuteListObserver* observer);
void removeObserver(LLMuteListObserver* observer);
diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h
index 29dbaedf7a..a44c6dd699 100644..100755
--- a/indra/newview/llnavigationbar.h
+++ b/indra/newview/llnavigationbar.h
@@ -30,6 +30,7 @@
#include "llpanel.h"
#include "llbutton.h"
#include "lllayoutstack.h"
+#include "llinitdestroyclass.h"
class LLLocationInputCtrl;
class LLMenuGL;
@@ -84,12 +85,12 @@ protected:
class LLNavigationBar
: public LLPanel, public LLSingleton<LLNavigationBar>, private LLDestroyClass<LLNavigationBar>
{
+ LLSINGLETON(LLNavigationBar);
+ virtual ~LLNavigationBar();
LOG_CLASS(LLNavigationBar);
friend class LLDestroyClass<LLNavigationBar>;
-
+
public:
- LLNavigationBar();
- virtual ~LLNavigationBar();
/*virtual*/ void draw();
/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/llnotificationmanager.h b/indra/newview/llnotificationmanager.h
index f37c6b833c..52c79cc689 100644
--- a/indra/newview/llnotificationmanager.h
+++ b/indra/newview/llnotificationmanager.h
@@ -46,11 +46,11 @@ class LLToast;
*/
class LLNotificationManager : public LLSingleton<LLNotificationManager>
{
- typedef std::pair<std::string, LLEventHandler*> eventhandlers;
-public:
- LLNotificationManager();
+ LLSINGLETON(LLNotificationManager);
virtual ~LLNotificationManager();
+ typedef std::pair<std::string, LLEventHandler*> eventhandlers;
+public:
//TODO: make private
// this method initialize handlers' map for different types of notifications
void init(void);
diff --git a/indra/newview/llnotificationstorage.cpp b/indra/newview/llnotificationstorage.cpp
index 3418b33d37..35fdfa88bb 100644
--- a/indra/newview/llnotificationstorage.cpp
+++ b/indra/newview/llnotificationstorage.cpp
@@ -45,9 +45,10 @@ typedef boost::function<LLNotificationResponderInterface * (const LLSD& pParams)
class LLResponderRegistry : public LLRegistrySingleton<std::string, responder_constructor_t, LLResponderRegistry>
{
- public:
- template<typename RESPONDER_TYPE> static LLNotificationResponderInterface * create(const LLSD& pParams);
- LLNotificationResponderInterface * createResponder(const std::string& pNotificationName, const LLSD& pParams);
+ LLSINGLETON_EMPTY_CTOR(LLResponderRegistry);
+public:
+ template<typename RESPONDER_TYPE> static LLNotificationResponderInterface * create(const LLSD& pParams);
+ LLNotificationResponderInterface * createResponder(const std::string& pNotificationName, const LLSD& pParams);
};
template<typename RESPONDER_TYPE> LLNotificationResponderInterface * LLResponderRegistry::create(const LLSD& pParams)
diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index de6a36ce2f..eeeb7e5c25 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -106,7 +106,8 @@ BOOL LLOutfitGallery::postBuild()
{
BOOL rv = LLOutfitListBase::postBuild();
mScrollPanel = getChild<LLScrollContainer>("gallery_scroll_panel");
- mGalleryPanel = getChild<LLPanel>("gallery_panel");
+ LLPanel::Params params = LLPanel::getDefaultParams(); // Don't parse XML when creating dummy LLPanel
+ mGalleryPanel = LLUICtrlFactory::create<LLPanel>(params);
mMessageTextBox = getChild<LLTextBox>("no_outfits_txt");
mOutfitGalleryMenu = new LLOutfitGalleryContextMenu(this);
return rv;
@@ -234,6 +235,7 @@ void LLOutfitGallery::removeLastRow()
{
mRowCount--;
mGalleryPanel->removeChild(mLastRowPanel);
+ mUnusedRowPanels.push_back(mLastRowPanel);
mRowPanels.pop_back();
mLastRowPanel = mRowPanels.back();
}
@@ -335,6 +337,7 @@ void LLOutfitGallery::removeFromLastRow(LLOutfitGalleryItem* item)
{
mItemPanels.back()->removeChild(item);
mLastRowPanel->removeChild(mItemPanels.back());
+ mUnusedItemPanels.push_back(mItemPanels.back());
mItemPanels.pop_back();
}
@@ -374,7 +377,16 @@ LLPanel* LLOutfitGallery::buildItemPanel(int left)
{
LLPanel::Params lpparams;
int top = 0;
- LLPanel* lpanel = LLUICtrlFactory::create<LLPanel>(lpparams);
+ LLPanel* lpanel = NULL;
+ if(mUnusedItemPanels.empty())
+ {
+ lpanel = LLUICtrlFactory::create<LLPanel>(lpparams);
+ }
+ else
+ {
+ lpanel = mUnusedItemPanels.back();
+ mUnusedItemPanels.pop_back();
+ }
LLRect rect = LLRect(left, top + mItemHeight, left + mItemWidth + mItemHorizontalGap, top);
lpanel->setRect(rect);
lpanel->reshape(mItemWidth + mItemHorizontalGap, mItemHeight);
@@ -387,7 +399,16 @@ LLPanel* LLOutfitGallery::buildItemPanel(int left)
LLPanel* LLOutfitGallery::buildRowPanel(int left, int bottom)
{
LLPanel::Params sparams;
- LLPanel* stack = LLUICtrlFactory::create<LLPanel>(sparams);
+ LLPanel* stack = NULL;
+ if(mUnusedRowPanels.empty())
+ {
+ stack = LLUICtrlFactory::create<LLPanel>(sparams);
+ }
+ else
+ {
+ stack = mUnusedRowPanels.back();
+ mUnusedRowPanels.pop_back();
+ }
moveRowPanel(stack, left, bottom);
return stack;
}
@@ -417,6 +438,19 @@ LLOutfitGallery::~LLOutfitGallery()
gInventory.removeObserver(mOutfitsObserver);
}
delete mOutfitsObserver;
+
+ while (!mUnusedRowPanels.empty())
+ {
+ LLPanel* panelp = mUnusedRowPanels.back();
+ mUnusedRowPanels.pop_back();
+ panelp->die();
+ }
+ while (!mUnusedItemPanels.empty())
+ {
+ LLPanel* panelp = mUnusedItemPanels.back();
+ mUnusedItemPanels.pop_back();
+ panelp->die();
+ }
}
void LLOutfitGallery::setFilterSubString(const std::string& string)
@@ -497,7 +531,7 @@ void LLOutfitGallery::updateAddedCategory(LLUUID cat_id)
// Start observing changes in "My Outfits" category.
mOutfitsObserver->addCategory(cat_id,
- boost::bind(&LLOutfitGallery::refreshOutfit, this, cat_id));
+ boost::bind(&LLOutfitGallery::refreshOutfit, this, cat_id), true);
outfit_category->fetch();
refreshOutfit(cat_id);
@@ -640,7 +674,6 @@ BOOL LLOutfitGalleryItem::postBuild()
mOutfitNameText = getChild<LLTextBox>("outfit_name");
mOutfitWornText = getChild<LLTextBox>("outfit_worn_text");
- mFotoBgPanel = getChild<LLPanel>("foto_bg_panel");
mTextBgPanel = getChild<LLPanel>("text_bg_panel");
setOutfitWorn(false);
mHidden = false;
@@ -1093,7 +1126,7 @@ void LLOutfitGallery::uploadPhoto(LLUUID outfit_id)
return;
}
- 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).
+ S32 expected_upload_cost = LLGlobalEconomy::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;
nruserdata = (void *)&outfit_id;
@@ -1161,7 +1194,7 @@ void LLOutfitGallery::onTexturePickerCommit(LLTextureCtrl::ETexturePickOp op, LL
}
else
{
- image_item_id = floaterp->findItemID(floaterp->getAssetID(), FALSE);
+ image_item_id = floaterp->findItemID(floaterp->getAssetID(), FALSE, TRUE);
if (image_item_id.isNull())
{
LL_WARNS() << "id or image_item_id is NULL!" << LL_ENDL;
diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h
index 6b13f264a4..b9fc10f015 100644
--- a/indra/newview/lloutfitgallery.h
+++ b/indra/newview/lloutfitgallery.h
@@ -158,6 +158,8 @@ private:
void moveRowPanel(LLPanel* stack, int left, int bottom);
std::vector<LLPanel*> mRowPanels;
std::vector<LLPanel*> mItemPanels;
+ std::vector<LLPanel*> mUnusedRowPanels;
+ std::vector<LLPanel*> mUnusedItemPanels;
std::vector<LLOutfitGalleryItem*> mItems;
std::vector<LLOutfitGalleryItem*> mHiddenItems;
LLScrollContainer* mScrollPanel;
@@ -273,7 +275,6 @@ private:
LLTextBox* mOutfitNameText;
LLTextBox* mOutfitWornText;
LLPanel* mTextBgPanel;
- LLPanel* mFotoBgPanel;
bool mSelected;
bool mWorn;
bool mDefaultImage;
diff --git a/indra/newview/lloutfitobserver.h b/indra/newview/lloutfitobserver.h
index 87d4b0c998..77041db68d 100644
--- a/indra/newview/lloutfitobserver.h
+++ b/indra/newview/lloutfitobserver.h
@@ -36,10 +36,10 @@
*/
class LLOutfitObserver: public LLInventoryObserver, public LLSingleton<LLOutfitObserver>
{
-public:
+ LLSINGLETON(LLOutfitObserver);
virtual ~LLOutfitObserver();
- friend class LLSingleton<LLOutfitObserver>;
+public:
virtual void changed(U32 mask);
@@ -58,7 +58,6 @@ public:
void addOutfitLockChangedCallback(const signal_t::slot_type& cb) { mOutfitLockChanged.connect(cb); }
protected:
- LLOutfitObserver();
/** Get a version of an inventory category specified by its UUID */
static S32 getCategoryVersion(const LLUUID& cat_id);
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 87c3c5042b..e1f51e62e3 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -872,8 +872,15 @@ void LLOutfitListBase::refreshList(const LLUUID& category_id)
++items_iter)
{
LLViewerInventoryCategory *cat = gInventory.getCategory(*items_iter);
- if (!cat) return;
-
+ if (!cat)
+ {
+ LLInventoryObject* obj = gInventory.getObject(*items_iter);
+ if(!obj || (obj->getType() != LLAssetType::AT_CATEGORY))
+ {
+ return;
+ }
+ cat = (LLViewerInventoryCategory*)obj;
+ }
std::string name = cat->getName();
updateChangedCategoryName(cat, name);
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index b7e1b2d3a4..f2d43a1037 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -117,8 +117,7 @@ class LLEditWearableDictionary : public LLSingleton<LLEditWearableDictionary>
//--------------------------------------------------------------------
// Constructors and Destructors
//--------------------------------------------------------------------
-public:
- LLEditWearableDictionary();
+ LLSINGLETON(LLEditWearableDictionary);
virtual ~LLEditWearableDictionary();
//--------------------------------------------------------------------
diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp
index 54728885c1..48b659a81e 100644
--- a/indra/newview/llpanelgroupnotices.cpp
+++ b/indra/newview/llpanelgroupnotices.cpp
@@ -37,7 +37,6 @@
#include "llinventoryfunctions.h"
#include "llinventoryicon.h"
#include "llinventorymodel.h"
-#include "llfloaterinventory.h"
#include "llagent.h"
#include "llagentui.h"
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index eb40616a9c..fa946ee5c7 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -33,7 +33,6 @@
#include "lldndbutton.h"
#include "lleconomy.h"
#include "llfilepicker.h"
-#include "llfloaterinventory.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
#include "llinventorymodelbackgroundfetch.h"
@@ -115,7 +114,6 @@ LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)
mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH));
mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND));
mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLPanelMainInventory::doCreate, this, _2));
- //mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this));
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));
@@ -1194,6 +1192,20 @@ bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata)
BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
{
const std::string command_name = userdata.asString();
+ if (command_name == "not_empty")
+ {
+ BOOL status = FALSE;
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (current_item)
+ {
+ const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(item_id, cat_array, item_array);
+ status = (0 == cat_array->size() && 0 == item_array->size());
+ }
+ return status;
+ }
if (command_name == "delete")
{
return getActivePanel()->isSelectionRemovable();
@@ -1251,6 +1263,18 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
LLSidepanelInventory* parent = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
return parent ? parent->canShare() : FALSE;
}
+ if (command_name == "empty_trash")
+ {
+ const LLUUID &trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ LLInventoryModel::EHasChildren children = gInventory.categoryHasChildren(trash_id);
+ return children != LLInventoryModel::CHILDREN_NO;
+ }
+ if (command_name == "empty_lostnfound")
+ {
+ const LLUUID &trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
+ LLInventoryModel::EHasChildren children = gInventory.categoryHasChildren(trash_id);
+ return children != LLInventoryModel::CHILDREN_NO;
+ }
return TRUE;
}
@@ -1309,7 +1333,7 @@ void LLPanelMainInventory::setUploadCostIfNeeded()
LLMenuItemBranchGL* upload_menu = menu->findChild<LLMenuItemBranchGL>("upload");
if(upload_menu)
{
- S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ S32 upload_cost = LLGlobalEconomy::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 efa18b42c1..38936804ac 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -86,6 +86,8 @@ public:
void setFocusFilterEditor();
+ static void newWindow();
+
protected:
//
// Misc functions
@@ -110,7 +112,6 @@ protected:
// menu callbacks
void doToSelected(const LLSD& userdata);
void closeAllFolders();
- void newWindow();
void doCreate(const LLSD& userdata);
void resetFilters();
void setSortBy(const LLSD& userdata);
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index 8b9941c0ca..208ee77f2d 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -51,7 +51,6 @@
#include "llbutton.h"
#include "llcombobox.h"
#include "llfiltereditor.h"
-#include "llfloaterinventory.h"
#include "llinventorybridge.h"
#include "llinventorymodel.h"
#include "llinventorymodelbackgroundfetch.h"
@@ -779,6 +778,10 @@ void LLPanelOutfitEdit::onVisibilityChanged(const LLSD &in_visible_chain)
{
update();
}
+ else
+ {
+ mWearableListManager->holdProgress(); //list population restarts with visibility
+ }
}
void LLPanelOutfitEdit::onAddWearableClicked(void)
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index 3f700496a9..007ab4dd63 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -42,6 +42,7 @@
#include "llpanelwearing.h"
#include "llsaveoutfitcombobtn.h"
#include "llsidepanelappearance.h"
+#include "llviewercontrol.h"
#include "llviewerfoldertype.h"
static const std::string OUTFITS_TAB_NAME = "outfitslist_tab";
@@ -67,6 +68,10 @@ LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
LLPanelOutfitsInventory::~LLPanelOutfitsInventory()
{
+ if (mAppearanceTabs)
+ {
+ gSavedSettings.setS32("LastAppearanceTab", mAppearanceTabs->getCurrentPanelIndex());
+ }
}
// virtual
@@ -102,6 +107,10 @@ void LLPanelOutfitsInventory::onOpen(const LLSD& key)
panel_appearance->fetchInventory();
panel_appearance->refreshCurrentOutfitName();
}
+
+ if (!mAppearanceTabs->selectTab(gSavedSettings.getS32("LastAppearanceTab")))
+ mAppearanceTabs->selectFirstTab();
+
mInitialized = true;
}
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 6e677bbce5..203c57b732 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -63,6 +63,7 @@
#include "roles_constants.h"
#include "llgroupactions.h"
#include "lltrans.h"
+#include "llinventorymodel.h"
U8 string_value_to_click_action(std::string p_value);
@@ -1016,13 +1017,26 @@ void LLPanelPermissions::onCommitNextOwnerTransfer(LLUICtrl* ctrl, void* data)
// static
void LLPanelPermissions::onCommitName(LLUICtrl*, void* data)
{
- //LL_INFOS() << "LLPanelPermissions::onCommitName()" << LL_ENDL;
LLPanelPermissions* self = (LLPanelPermissions*)data;
LLLineEditor* tb = self->getChild<LLLineEditor>("Object Name");
- if(tb)
+ if (!tb)
{
- LLSelectMgr::getInstance()->selectionSetObjectName(tb->getText());
-// LLSelectMgr::getInstance()->selectionSetObjectName(self->mLabelObjectName->getText());
+ return;
+ }
+ LLSelectMgr::getInstance()->selectionSetObjectName(tb->getText());
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+ if (selection->isAttachment() && (selection->getNumNodes() == 1) && !tb->getText().empty())
+ {
+ LLUUID object_id = selection->getFirstObject()->getAttachmentItemID();
+ LLViewerInventoryItem* item = findItem(object_id);
+ if (item)
+ {
+ LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+ new_item->rename(tb->getText());
+ new_item->updateServer(FALSE);
+ gInventory.updateItem(new_item);
+ gInventory.notifyObservers();
+ }
}
}
@@ -1030,12 +1044,26 @@ void LLPanelPermissions::onCommitName(LLUICtrl*, void* data)
// static
void LLPanelPermissions::onCommitDesc(LLUICtrl*, void* data)
{
- //LL_INFOS() << "LLPanelPermissions::onCommitDesc()" << LL_ENDL;
LLPanelPermissions* self = (LLPanelPermissions*)data;
LLLineEditor* le = self->getChild<LLLineEditor>("Object Description");
- if(le)
+ if (!le)
{
- LLSelectMgr::getInstance()->selectionSetObjectDescription(le->getText());
+ return;
+ }
+ LLSelectMgr::getInstance()->selectionSetObjectDescription(le->getText());
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+ if (selection->isAttachment() && (selection->getNumNodes() == 1))
+ {
+ LLUUID object_id = selection->getFirstObject()->getAttachmentItemID();
+ LLViewerInventoryItem* item = findItem(object_id);
+ if (item)
+ {
+ LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+ new_item->setDescription(le->getText());
+ new_item->updateServer(FALSE);
+ gInventory.updateItem(new_item);
+ gInventory.notifyObservers();
+ }
}
}
@@ -1159,3 +1187,12 @@ void LLPanelPermissions::onCommitIncludeInSearch(LLUICtrl* ctrl, void*)
LLSelectMgr::getInstance()->selectionSetIncludeInSearch(box->get());
}
+
+LLViewerInventoryItem* LLPanelPermissions::findItem(LLUUID &object_id)
+{
+ if (!object_id.isNull())
+ {
+ return gInventory.getItem(object_id);
+ }
+ return NULL;
+}
diff --git a/indra/newview/llpanelpermissions.h b/indra/newview/llpanelpermissions.h
index 87805bbf90..2d15954baa 100644
--- a/indra/newview/llpanelpermissions.h
+++ b/indra/newview/llpanelpermissions.h
@@ -37,6 +37,7 @@
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLNameBox;
+class LLViewerInventoryItem;
class LLPanelPermissions : public LLPanel
{
@@ -77,6 +78,8 @@ protected:
static void onCommitClickAction(LLUICtrl* ctrl, void*);
static void onCommitIncludeInSearch(LLUICtrl* ctrl, void*);
+ static LLViewerInventoryItem* findItem(LLUUID &object_id);
+
protected:
void disableAll();
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index 2fa4ee376a..610b3a6396 100644
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -502,10 +502,6 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
if(!parcel->getGroupID().isNull())
{
- // FIXME: Using parcel group as region group.
- gCacheName->getGroup(parcel->getGroupID(),
- boost::bind(&LLPanelPlaceInfo::onNameCache, mRegionGroupText, _2));
-
std::string owner =
LLSLURL("group", parcel->getGroupID(), "inspect").getSLURLString();
mParcelOwner->setText(owner);
@@ -524,12 +520,20 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
LLSLURL("agent", parcel->getOwnerID(), "inspect").getSLURLString();
mParcelOwner->setText(parcel_owner);
LLAvatarNameCache::get(region->getOwner(), boost::bind(&LLPanelPlaceInfo::onAvatarNameCache, _1, _2, mRegionOwnerText));
+ mRegionGroupText->setText( getString("none_text"));
}
if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus())
{
mRegionOwnerText->setText(mRegionOwnerText->getText() + getString("sale_pending_text"));
}
+
+ if(!parcel->getGroupID().isNull())
+ {
+ // FIXME: Using parcel group as region group.
+ gCacheName->getGroup(parcel->getGroupID(),
+ boost::bind(&LLPanelPlaceInfo::onNameCache, mRegionGroupText, _2));
+ }
}
mEstateRatingText->setText(region->getSimAccessString());
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index a9a0c30e26..ed942fc7fc 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -304,7 +304,11 @@ BOOL LLPanelPlaces::postBuild()
enable_registrar.add("Places.OverflowMenu.Enable", boost::bind(&LLPanelPlaces::onOverflowMenuItemEnable, this, _2));
mPlaceMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_place.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- if (!mPlaceMenu)
+ if (mPlaceMenu)
+ {
+ mPlaceMenu->setAlwaysShowMenu(TRUE);
+ }
+ else
{
LL_WARNS() << "Error loading Place menu" << LL_ENDL;
}
@@ -711,6 +715,34 @@ void LLPanelPlaces::onEditButtonClicked()
updateVerbs();
}
+class LLUpdateLandmarkParent : public LLInventoryCallback
+{
+public:
+ LLUpdateLandmarkParent(LLPointer<LLViewerInventoryItem> item, LLUUID new_parent) :
+ mItem(item),
+ mNewParentId(new_parent)
+ {};
+ /* virtual */ void fire(const LLUUID& inv_item_id)
+ {
+ LLInventoryModel::update_list_t update;
+ LLInventoryModel::LLCategoryUpdate old_folder(mItem->getParentUUID(), -1);
+ update.push_back(old_folder);
+ LLInventoryModel::LLCategoryUpdate new_folder(mNewParentId, 1);
+ update.push_back(new_folder);
+ gInventory.accountForUpdate(update);
+
+ mItem->setParent(mNewParentId);
+ mItem->updateParentOnServer(FALSE);
+
+ gInventory.updateItem(mItem);
+ gInventory.notifyObservers();
+ }
+
+private:
+ LLPointer<LLViewerInventoryItem> mItem;
+ LLUUID mNewParentId;
+};
+
void LLPanelPlaces::onSaveButtonClicked()
{
if (!mLandmarkInfo || mItem.isNull())
@@ -726,6 +758,7 @@ void LLPanelPlaces::onSaveButtonClicked()
LLUUID item_id = mItem->getUUID();
LLUUID folder_id = mLandmarkInfo->getLandmarkFolder();
+ bool change_parent = folder_id != mItem->getParentUUID();
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(mItem);
@@ -734,10 +767,16 @@ void LLPanelPlaces::onSaveButtonClicked()
{
new_item->rename(current_title_value);
new_item->setDescription(current_notes_value);
- new_item->updateServer(FALSE);
+ LLPointer<LLInventoryCallback> cb;
+ if (change_parent)
+ {
+ cb = new LLUpdateLandmarkParent(new_item, folder_id);
+ }
+ LLInventoryModel::LLCategoryUpdate up(mItem->getParentUUID(), 0);
+ gInventory.accountForUpdate(up);
+ update_inventory_item(new_item, cb);
}
-
- if(folder_id != mItem->getParentUUID())
+ else if (change_parent)
{
LLInventoryModel::update_list_t update;
LLInventoryModel::LLCategoryUpdate old_folder(mItem->getParentUUID(),-1);
@@ -971,7 +1010,7 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)
mPlaceInfoType == LANDMARK_TAB_INFO_TYPE)
{
mLandmarkInfo->setVisible(visible);
-
+ mPlaceProfile->setVisible(FALSE);
if (visible)
{
mLandmarkInfo->resetLocation();
@@ -979,8 +1018,6 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)
LLRect rect = getRect();
LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom);
mLandmarkInfo->reshape(new_rect.getWidth(), new_rect.getHeight());
-
- mPlaceProfile->setVisible(FALSE);
}
else
{
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 0bcd8a9e63..5f413fc3c0 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -566,11 +566,16 @@ void LLPanelPrimMediaControls::updateShape()
}
}
- // MAINT-1392 If this is a HUD always set it visible, but hide each control if user has no perms.
- // When setting it invisible it won't receive any mouse messages anymore
+ // Web plugins and HUD may have media controls invisible for user, but still need scroll mouse events.
+ // LLView checks for visibleEnabledAndContains() and won't pass events to invisible panel, so instead
+ // of hiding whole panel hide each control instead (if user has no perms).
+ // Note: It might be beneficial to keep panel visible for all plugins to make behavior consistent, but
+ // for now limiting change to cases that need events.
- if( !is_hud )
+ if (!is_hud && (!media_plugin || media_plugin->pluginSupportsMediaTime()))
+ {
setVisible(enabled);
+ }
else
{
if( !hasPermsControl )
diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp
index b2952834fb..21ac7604ff 100644
--- a/indra/newview/llpanelsnapshotinventory.cpp
+++ b/indra/newview/llpanelsnapshotinventory.cpp
@@ -135,7 +135,7 @@ BOOL LLPanelSnapshotInventory::postBuild()
// virtual
void LLPanelSnapshotInventory::onOpen(const LLSD& key)
{
- getChild<LLUICtrl>("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload()));
+ getChild<LLUICtrl>("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", LLGlobalEconomy::getInstance()->getPriceUpload()));
LLPanelSnapshot::onOpen(key);
}
@@ -155,7 +155,7 @@ void LLPanelSnapshotInventory::onResolutionCommit(LLUICtrl* ctrl)
void LLPanelSnapshotInventoryBase::onSend()
{
- S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ S32 expected_upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload();
if (can_afford_transaction(expected_upload_cost))
{
if (mSnapshotFloater)
@@ -191,7 +191,7 @@ BOOL LLPanelOutfitSnapshotInventory::postBuild()
// virtual
void LLPanelOutfitSnapshotInventory::onOpen(const LLSD& key)
{
- getChild<LLUICtrl>("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload()));
+ getChild<LLUICtrl>("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", LLGlobalEconomy::getInstance()->getPriceUpload()));
LLPanelSnapshot::onOpen(key);
}
diff --git a/indra/newview/llpanelsnapshotoptions.cpp b/indra/newview/llpanelsnapshotoptions.cpp
index 269f16c5e4..95c14e4226 100644
--- a/indra/newview/llpanelsnapshotoptions.cpp
+++ b/indra/newview/llpanelsnapshotoptions.cpp
@@ -77,12 +77,12 @@ LLPanelSnapshotOptions::LLPanelSnapshotOptions()
mCommitCallbackRegistrar.add("Snapshot.SendToFacebook", boost::bind(&LLPanelSnapshotOptions::onSendToFacebook, this));
mCommitCallbackRegistrar.add("Snapshot.SendToTwitter", boost::bind(&LLPanelSnapshotOptions::onSendToTwitter, this));
mCommitCallbackRegistrar.add("Snapshot.SendToFlickr", boost::bind(&LLPanelSnapshotOptions::onSendToFlickr, this));
- LLGlobalEconomy::Singleton::getInstance()->addObserver(this);
+ LLGlobalEconomy::getInstance()->addObserver(this);
}
LLPanelSnapshotOptions::~LLPanelSnapshotOptions()
{
- LLGlobalEconomy::Singleton::getInstance()->removeObserver(this);
+ LLGlobalEconomy::getInstance()->removeObserver(this);
}
// virtual
@@ -100,7 +100,7 @@ void LLPanelSnapshotOptions::onOpen(const LLSD& key)
void LLPanelSnapshotOptions::updateUploadCost()
{
- S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ S32 upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload();
getChild<LLUICtrl>("save_to_inventory_btn")->setLabelArg("[AMOUNT]", llformat("%d", upload_cost));
}
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 3de9dc2f80..fe0608d544 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -104,7 +104,9 @@ private:
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
-class LLTeleportHistoryFlatItemStorage: public LLSingleton<LLTeleportHistoryFlatItemStorage> {
+class LLTeleportHistoryFlatItemStorage: public LLSingleton<LLTeleportHistoryFlatItemStorage>
+{
+ LLSINGLETON_EMPTY_CTOR(LLTeleportHistoryFlatItemStorage);
protected:
typedef std::vector< LLHandle<LLTeleportHistoryFlatItem> > flat_item_list_t;
diff --git a/indra/newview/llpaneltopinfobar.h b/indra/newview/llpaneltopinfobar.h
index f37bd9c048..78dd997029 100644
--- a/indra/newview/llpaneltopinfobar.h
+++ b/indra/newview/llpaneltopinfobar.h
@@ -28,6 +28,7 @@
#define LLPANELTOPINFOBAR_H_
#include "llpanel.h"
+#include "llinitdestroyclass.h"
class LLButton;
class LLTextBox;
@@ -36,6 +37,8 @@ class LLParcelChangeObserver;
class LLPanelTopInfoBar : public LLPanel, public LLSingleton<LLPanelTopInfoBar>, private LLDestroyClass<LLPanelTopInfoBar>
{
+ LLSINGLETON(LLPanelTopInfoBar);
+ ~LLPanelTopInfoBar();
LOG_CLASS(LLPanelTopInfoBar);
friend class LLDestroyClass<LLPanelTopInfoBar>;
@@ -43,9 +46,6 @@ class LLPanelTopInfoBar : public LLPanel, public LLSingleton<LLPanelTopInfoBar>,
public:
typedef boost::signals2::signal<void ()> resize_signal_t;
- LLPanelTopInfoBar();
- ~LLPanelTopInfoBar();
-
/*virtual*/ BOOL postBuild();
/*virtual*/ void draw();
diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp
index 796372ba04..a150007177 100644
--- a/indra/newview/llpanelwearing.cpp
+++ b/indra/newview/llpanelwearing.cpp
@@ -232,6 +232,7 @@ BOOL LLPanelWearing::postBuild()
{
mAccordionCtrl = getChild<LLAccordionCtrl>("wearables_accordion");
mWearablesTab = getChild<LLAccordionCtrlTab>("tab_wearables");
+ mWearablesTab->setIgnoreResizeNotification(true);
mAttachmentsTab = getChild<LLAccordionCtrlTab>("tab_temp_attachments");
mAttachmentsTab->setDropDownStateChangedCallback(boost::bind(&LLPanelWearing::onAccordionTabStateChanged, this));
diff --git a/indra/newview/llpathfindingmanager.cpp b/indra/newview/llpathfindingmanager.cpp
index 711a869e82..cb4c07a417 100644
--- a/indra/newview/llpathfindingmanager.cpp
+++ b/indra/newview/llpathfindingmanager.cpp
@@ -144,8 +144,7 @@ typedef boost::shared_ptr<LinksetsResponder> LinksetsResponderPtr;
// LLPathfindingManager
//---------------------------------------------------------------------------
-LLPathfindingManager::LLPathfindingManager()
- : LLSingleton<LLPathfindingManager>(),
+LLPathfindingManager::LLPathfindingManager():
mNavMeshMap(),
mAgentStateSignal()
{
diff --git a/indra/newview/llpathfindingmanager.h b/indra/newview/llpathfindingmanager.h
index e8fad590ba..a44cd892da 100644
--- a/indra/newview/llpathfindingmanager.h
+++ b/indra/newview/llpathfindingmanager.h
@@ -48,6 +48,9 @@ class LinksetsResponder;
class LLPathfindingManager : public LLSingleton<LLPathfindingManager>
{
+ LLSINGLETON(LLPathfindingManager);
+ virtual ~LLPathfindingManager();
+
friend class LLNavMeshSimStateChangeNode;
friend class NavMeshStatusResponder;
friend class LLAgentStateChangeNode;
@@ -60,9 +63,6 @@ public:
kRequestError
} ERequestStatus;
- LLPathfindingManager();
- virtual ~LLPathfindingManager();
-
void initSystem();
void quitSystem();
diff --git a/indra/newview/llpathfindingpathtool.cpp b/indra/newview/llpathfindingpathtool.cpp
index 006755e20b..3187325101 100644
--- a/indra/newview/llpathfindingpathtool.cpp
+++ b/indra/newview/llpathfindingpathtool.cpp
@@ -46,7 +46,6 @@
LLPathfindingPathTool::LLPathfindingPathTool()
: LLTool(PATH_TOOL_NAME),
- LLSingleton<LLPathfindingPathTool>(),
mFinalPathData(),
mTempPathData(),
mPathResult(LLPathingLib::LLPL_NO_PATH),
diff --git a/indra/newview/llpathfindingpathtool.h b/indra/newview/llpathfindingpathtool.h
index 97284265f1..88cb3a15f8 100644
--- a/indra/newview/llpathfindingpathtool.h
+++ b/indra/newview/llpathfindingpathtool.h
@@ -36,6 +36,9 @@
class LLPathfindingPathTool : public LLTool, public LLSingleton<LLPathfindingPathTool>
{
+ LLSINGLETON(LLPathfindingPathTool);
+ virtual ~LLPathfindingPathTool();
+
public:
typedef enum
{
@@ -59,9 +62,6 @@ public:
kCharacterTypeD
} ECharacterType;
- LLPathfindingPathTool();
- virtual ~LLPathfindingPathTool();
-
typedef boost::function<void (void)> path_event_callback_t;
typedef boost::signals2::signal<void (void)> path_event_signal_t;
typedef boost::signals2::connection path_event_slot_t;
diff --git a/indra/newview/llpersistentnotificationstorage.cpp b/indra/newview/llpersistentnotificationstorage.cpp
index 9c0222d0bc..264382ae82 100644
--- a/indra/newview/llpersistentnotificationstorage.cpp
+++ b/indra/newview/llpersistentnotificationstorage.cpp
@@ -36,9 +36,8 @@
#include "llscriptfloater.h"
#include "llviewermessage.h"
#include "llviewernetwork.h"
-LLPersistentNotificationStorage::LLPersistentNotificationStorage()
- : LLSingleton<LLPersistentNotificationStorage>()
- , LLNotificationStorage("")
+LLPersistentNotificationStorage::LLPersistentNotificationStorage():
+ LLNotificationStorage("")
, mLoaded(false)
{
}
diff --git a/indra/newview/llpersistentnotificationstorage.h b/indra/newview/llpersistentnotificationstorage.h
index bf0306380e..40c9923c74 100644
--- a/indra/newview/llpersistentnotificationstorage.h
+++ b/indra/newview/llpersistentnotificationstorage.h
@@ -45,10 +45,10 @@ class LLSD;
class LLPersistentNotificationStorage : public LLSingleton<LLPersistentNotificationStorage>, public LLNotificationStorage
{
+ LLSINGLETON(LLPersistentNotificationStorage);
+ ~LLPersistentNotificationStorage();
LOG_CLASS(LLPersistentNotificationStorage);
public:
- LLPersistentNotificationStorage();
- ~LLPersistentNotificationStorage();
void saveNotifications();
void loadNotifications();
diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp
index a498d27d2b..55cb7d616b 100644
--- a/indra/newview/llplacesinventorybridge.cpp
+++ b/indra/newview/llplacesinventorybridge.cpp
@@ -30,7 +30,6 @@
#include "llplacesinventorybridge.h"
-#include "llfloaterinventory.h" // for LLInventoryPanel
#include "llfolderview.h" // for FIRST_SELECTED_ITEM
#include "llinventorypanel.h"
diff --git a/indra/newview/llplacesinventorypanel.h b/indra/newview/llplacesinventorypanel.h
index 2805fc4257..27d9b83bd1 100644
--- a/indra/newview/llplacesinventorypanel.h
+++ b/indra/newview/llplacesinventorypanel.h
@@ -27,7 +27,6 @@
#ifndef LL_LLINVENTORYSUBTREEPANEL_H
#define LL_LLINVENTORYSUBTREEPANEL_H
-#include "llfloaterinventory.h"
#include "llinventorypanel.h"
class LLLandmarksPanel;
diff --git a/indra/newview/llpresetsmanager.cpp b/indra/newview/llpresetsmanager.cpp
index 836f63bffa..f40b3e0295 100644
--- a/indra/newview/llpresetsmanager.cpp
+++ b/indra/newview/llpresetsmanager.cpp
@@ -55,6 +55,10 @@ void LLPresetsManager::triggerChangeSignal()
void LLPresetsManager::createMissingDefault()
{
+ if(gDirUtilp->getLindenUserDir().empty())
+ {
+ return;
+ }
std::string default_file = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PRESETS_DIR, PRESETS_GRAPHIC, PRESETS_DEFAULT + ".xml");
if (!gDirUtilp->fileExists(default_file))
{
diff --git a/indra/newview/llpresetsmanager.h b/indra/newview/llpresetsmanager.h
index 21f9885f27..0014e32267 100644
--- a/indra/newview/llpresetsmanager.h
+++ b/indra/newview/llpresetsmanager.h
@@ -46,6 +46,9 @@ enum EDefaultOptions
class LLPresetsManager : public LLSingleton<LLPresetsManager>
{
+ LLSINGLETON(LLPresetsManager);
+ ~LLPresetsManager();
+
public:
typedef std::list<std::string> preset_name_list_t;
@@ -67,9 +70,6 @@ public:
preset_name_list_t mPresetNames;
- LLPresetsManager();
- ~LLPresetsManager();
-
preset_list_signal_t mPresetListChangeSignal;
private:
diff --git a/indra/newview/llproductinforequest.h b/indra/newview/llproductinforequest.h
index 75dbf220d1..d1036374e8 100644
--- a/indra/newview/llproductinforequest.h
+++ b/indra/newview/llproductinforequest.h
@@ -41,12 +41,11 @@
*/
class LLProductInfoRequestManager : public LLSingleton<LLProductInfoRequestManager>
{
+ LLSINGLETON(LLProductInfoRequestManager);
public:
- LLProductInfoRequestManager();
std::string getDescriptionForSku(const std::string& sku);
private:
- friend class LLSingleton<LLProductInfoRequestManager>;
/* virtual */ void initSingleton();
void getLandDescriptionsCoro(std::string url);
diff --git a/indra/newview/llrecentpeople.h b/indra/newview/llrecentpeople.h
index d0d6376867..c7aaf604f5 100644
--- a/indra/newview/llrecentpeople.h
+++ b/indra/newview/llrecentpeople.h
@@ -50,6 +50,7 @@ class LLDate;
*/
class LLRecentPeople: public LLSingleton<LLRecentPeople>, public LLOldEvents::LLSimpleListener
{
+ LLSINGLETON_EMPTY_CTOR(LLRecentPeople);
LOG_CLASS(LLRecentPeople);
public:
typedef boost::signals2::signal<void ()> signal_t;
diff --git a/indra/newview/llregioninfomodel.h b/indra/newview/llregioninfomodel.h
index d22a0de463..ea9640efda 100644
--- a/indra/newview/llregioninfomodel.h
+++ b/indra/newview/llregioninfomodel.h
@@ -36,6 +36,7 @@ class LLMessageSystem;
*/
class LLRegionInfoModel : public LLSingleton<LLRegionInfoModel>
{
+ LLSINGLETON(LLRegionInfoModel);
LOG_CLASS(LLRegionInfoModel);
public:
@@ -73,10 +74,8 @@ public:
std::string mSimType;
protected:
- friend class LLSingleton<LLRegionInfoModel>;
friend class LLViewerRegion;
- LLRegionInfoModel();
/**
* Refresh model with data from the incoming server message.
diff --git a/indra/newview/llremoteparcelrequest.h b/indra/newview/llremoteparcelrequest.h
index cb5af50c5f..5b0d189137 100644
--- a/indra/newview/llremoteparcelrequest.h
+++ b/indra/newview/llremoteparcelrequest.h
@@ -74,9 +74,10 @@ protected:
class LLRemoteParcelInfoProcessor : public LLSingleton<LLRemoteParcelInfoProcessor>
{
-public:
+ LLSINGLETON_EMPTY_CTOR(LLRemoteParcelInfoProcessor);
virtual ~LLRemoteParcelInfoProcessor() {}
+public:
void addObserver(const LLUUID& parcel_id, LLRemoteParcelInfoObserver* observer);
void removeObserver(const LLUUID& parcel_id, LLRemoteParcelInfoObserver* observer);
diff --git a/indra/newview/llrootview.h b/indra/newview/llrootview.h
index 5223a314f3..2ac958e7b8 100644
--- a/indra/newview/llrootview.h
+++ b/indra/newview/llrootview.h
@@ -32,7 +32,9 @@
#include "lltooltip.h"
class LLRootViewRegistry : public LLChildRegistry<LLRootViewRegistry>
-{};
+{
+ LLSINGLETON(LLRootViewRegistry);
+};
class LLRootView : public LLView
{
diff --git a/indra/newview/llscenemonitor.h b/indra/newview/llscenemonitor.h
index 2b6ea57b96..7cd531bd34 100644
--- a/indra/newview/llscenemonitor.h
+++ b/indra/newview/llscenemonitor.h
@@ -39,10 +39,10 @@ class LLViewerTexture;
class LLSceneMonitor : public LLSingleton<LLSceneMonitor>
{
+ LLSINGLETON(LLSceneMonitor);
+ ~LLSceneMonitor();
LOG_CLASS(LLSceneMonitor);
public:
- LLSceneMonitor();
- ~LLSceneMonitor();
void freezeAvatar(LLCharacter* avatarp);
void setDebugViewerVisible(bool visible);
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index ba2c37ce7c..681787bcbe 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -117,6 +117,14 @@ BOOL LLScreenChannelBase::postBuild()
void LLScreenChannelBase::reshape(S32 width, S32 height, BOOL called_from_parent)
{
+ if (mChannelAlignment == CA_CENTRE)
+ {
+ // Keep notifications and alerts centered
+ // WorldViewRectScaled is out of date at reshape but Window has same width
+ S32 channel_bound = gViewerWindow->getWindowRectScaled().getWidth() / 2;
+ setRect(LLRect(channel_bound, 0, channel_bound, 0));
+ updateRect(); //sets top and bottom only
+ }
redrawToasts();
}
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
index 70451194b3..c0b84abdcb 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -41,6 +41,7 @@ class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
// *TODO
// LLScriptFloaterManager and LLScriptFloater will need some refactoring after we
// know how script notifications should look like.
+ LLSINGLETON_EMPTY_CTOR(LLScriptFloaterManager);
public:
typedef enum e_object_type
diff --git a/indra/newview/llsearchhistory.h b/indra/newview/llsearchhistory.h
index 3309a8fcac..5aab5e6765 100644
--- a/indra/newview/llsearchhistory.h
+++ b/indra/newview/llsearchhistory.h
@@ -28,6 +28,7 @@
#define LL_LLSEARCHHISTORY_H
#include "llsingleton.h"
+#include "llinitdestroyclass.h"
#include "llui.h"
/**
@@ -36,6 +37,7 @@
*/
class LLSearchHistory : public LLSingleton<LLSearchHistory>, private LLDestroyClass<LLSearchHistory>
{
+ LLSINGLETON(LLSearchHistory);
friend class LLDestroyClass<LLSearchHistory>;
public:
@@ -71,7 +73,6 @@ public:
*/
void addEntry(const std::string& search_text);
- LLSearchHistory();
/**
* Class for storing data about single search request.
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 323689b788..e4641d8721 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -6006,6 +6006,11 @@ S32 LLSelectNode::getLastSelectedTE()
return mLastTESelected;
}
+S32 LLSelectNode::getLastOperatedTE()
+{
+ return mLastTESelected;
+}
+
LLViewerObject* LLSelectNode::getObject()
{
if (!mObject)
@@ -6244,6 +6249,9 @@ void pushWireframe(LLDrawable* drawable)
void LLSelectNode::renderOneWireframe(const LLColor4& color)
{
+ //Need to because crash on ATI 3800 (and similar cards) MAINT-5018
+ LLGLDisable multisample(LLPipeline::RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
+
LLViewerObject* objectp = getObject();
if (!objectp)
{
@@ -7093,7 +7101,7 @@ F32 LLObjectSelection::getSelectedLinksetCost()
LLSelectNode* node = *iter;
LLViewerObject* object = node->getObject();
- if (object)
+ if (object && !object->isAttachment())
{
LLViewerObject* root = static_cast<LLViewerObject*>(object->getRoot());
if (root)
@@ -7197,7 +7205,9 @@ U32 LLObjectSelection::getSelectedObjectTriangleCount(S32* vcount)
if (object)
{
- count += object->getTriangleCount(vcount);
+ S32 vt = 0;
+ count += object->getTriangleCount(&vt);
+ *vcount += vt;
}
}
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index bc50e443f8..2a893af266 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -170,6 +170,7 @@ public:
void selectTE(S32 te_index, BOOL selected);
BOOL isTESelected(S32 te_index);
S32 getLastSelectedTE();
+ S32 getLastOperatedTE();
S32 getTESelectMask() { return mTESelectMask; }
void renderOneWireframe(const LLColor4& color);
void renderOneSilhouette(const LLColor4 &color);
@@ -388,6 +389,9 @@ struct LLSelectGetFirstTest;
class LLSelectMgr : public LLEditMenuHandler, public LLSingleton<LLSelectMgr>
{
+ LLSINGLETON(LLSelectMgr);
+ ~LLSelectMgr();
+
public:
static BOOL sRectSelectInclusive; // do we need to surround an object to pick it?
static BOOL sRenderHiddenSelections; // do we show selection silhouettes that are occluded?
@@ -413,9 +417,6 @@ public:
LLCachedControl<bool> mDebugSelectMgr;
public:
- LLSelectMgr();
- ~LLSelectMgr();
-
static void cleanupGlobals();
// LLEditMenuHandler interface
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index f07f0ed86c..3e95811bb8 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -383,12 +383,22 @@ void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible, BOOL disable_cam
void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLViewerWearable *wearable, BOOL disable_camera_switch)
{
- if (!mEditWearable || ((mEditWearable->getWearable() == wearable) && mEditWearable->getVisible() == visible))
+ if (!mEditWearable)
{
- // visibility isn't changing, hence nothing to do
return;
}
+ if (mEditWearable->getVisible() == visible && (!visible || mEditWearable->getWearable() != wearable))
+ {
+ // visibility isn't changing and panel doesn't need an update, hence nothing to do
+ return;
+ }
+
+ // If we're just switching between outfit and wearable editing or updating item,
+ // don't end customization and don't switch camera
+ // Don't end customization and don't switch camera without visibility change
+ BOOL change_state = !disable_camera_switch && mEditWearable->getVisible() != visible;
+
if (!wearable)
{
wearable = gAgentWearables.getViewerWearable(LLWearableType::WT_SHAPE, 0);
@@ -403,18 +413,19 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLViewerWearab
if (visible)
{
- LLVOAvatarSelf::onCustomizeStart(disable_camera_switch);
- mEditWearable->setWearable(wearable, disable_camera_switch);
+ LLVOAvatarSelf::onCustomizeStart(!change_state);
+ mEditWearable->setWearable(wearable, !change_state);
mEditWearable->onOpen(LLSD()); // currently no-op, just for consistency
}
else
{
// Save changes if closing.
mEditWearable->saveChanges();
+ mEditWearable->setWearable(NULL);
LLAppearanceMgr::getInstance()->updateIsDirty();
- if (!disable_camera_switch) // if we're just switching between outfit and wearable editing, don't end customization.
+ if (change_state)
{
- LLVOAvatarSelf::onCustomizeEnd(disable_camera_switch);
+ LLVOAvatarSelf::onCustomizeEnd(!change_state);
}
}
}
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index 6bcae1e858..c6a0198afd 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -34,6 +34,7 @@
#include "llbutton.h"
#include "lldate.h"
#include "llfirstuse.h"
+#include "llfloaterreg.h"
#include "llfloatersidepanelcontainer.h"
#include "llfoldertype.h"
#include "llfolderview.h"
@@ -731,3 +732,16 @@ std::set<LLFolderViewItem*> LLSidepanelInventory::getInboxSelectionList()
return inventory_selected_uuids;
}
+
+void LLSidepanelInventory::cleanup()
+{
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
+ for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end();)
+ {
+ LLFloaterSidePanelContainer* iv = dynamic_cast<LLFloaterSidePanelContainer*>(*iter++);
+ if (iv)
+ {
+ iv->cleanup();
+ }
+ }
+}
diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h
index 17a3098db9..5060f7025f 100644
--- a/indra/newview/llsidepanelinventory.h
+++ b/indra/newview/llsidepanelinventory.h
@@ -82,6 +82,8 @@ public:
void updateVerbs();
+ static void cleanup();
+
protected:
// Tracks highlighted (selected) item in inventory panel.
LLInventoryItem *getSelectedItem();
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index 049aae1336..58e48480c1 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -465,7 +465,11 @@ void LLSnapshotLivePreview::reshape(S32 width, S32 height, BOOL called_from_pare
LL_DEBUGS() << "window reshaped, updating thumbnail" << LL_ENDL;
if (mViewContainer && mViewContainer->isInVisibleChain())
{
- updateSnapshot(TRUE);
+ // We usually resize only on window reshape, so give it a chance to redraw, assign delay
+ updateSnapshot(
+ TRUE, // new snapshot is needed
+ FALSE, // thumbnail will be updated either way.
+ AUTO_SNAPSHOT_TIME_DELAY); // shutter delay.
}
}
}
@@ -1032,7 +1036,7 @@ void LLSnapshotLivePreview::saveTexture(BOOL outfit_snapshot, std::string name)
LLAgentUI::buildLocationString(pos_string, LLAgentUI::LOCATION_FORMAT_FULL);
std::string who_took_it;
LLAgentUI::buildFullname(who_took_it);
- S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ S32 expected_upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload();
std::string res_name = outfit_snapshot ? name : "Snapshot : " + pos_string;
std::string res_desc = outfit_snapshot ? "" : "Taken by " + who_took_it + " at " + pos_string;
LLFolderType::EType folder_type = outfit_snapshot ? LLFolderType::FT_NONE : LLFolderType::FT_SNAPSHOT_CATEGORY;
diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h
index 5cff70f377..617bae3984 100644
--- a/indra/newview/llspeakers.h
+++ b/indra/newview/llspeakers.h
@@ -341,20 +341,18 @@ protected:
class LLActiveSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLActiveSpeakerMgr>
{
+ LLSINGLETON(LLActiveSpeakerMgr);
LOG_CLASS(LLActiveSpeakerMgr);
-public:
- LLActiveSpeakerMgr();
protected:
virtual void updateSpeakerList();
};
class LLLocalSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLLocalSpeakerMgr>
{
- LOG_CLASS(LLLocalSpeakerMgr);
-public:
- LLLocalSpeakerMgr();
+ LLSINGLETON(LLLocalSpeakerMgr);
~LLLocalSpeakerMgr ();
+ LOG_CLASS(LLLocalSpeakerMgr);
protected:
virtual void updateSpeakerList();
};
diff --git a/indra/newview/llspeakingindicatormanager.cpp b/indra/newview/llspeakingindicatormanager.cpp
index 78fe7863c8..5ca1d4b4a5 100644
--- a/indra/newview/llspeakingindicatormanager.cpp
+++ b/indra/newview/llspeakingindicatormanager.cpp
@@ -48,6 +48,8 @@
*/
class SpeakingIndicatorManager : public LLSingleton<SpeakingIndicatorManager>, LLVoiceClientParticipantObserver
{
+ LLSINGLETON(SpeakingIndicatorManager);
+ ~SpeakingIndicatorManager();
LOG_CLASS(SpeakingIndicatorManager);
public:
@@ -91,10 +93,6 @@ private:
typedef speaking_indicators_mmap_t::const_iterator indicator_const_iterator;
typedef std::pair<indicator_const_iterator, indicator_const_iterator> indicator_range_t;
- friend class LLSingleton<SpeakingIndicatorManager>;
- SpeakingIndicatorManager();
- ~SpeakingIndicatorManager();
-
/**
* Callback to determine when voice channel is changed.
*
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index dab25f144b..57a06da287 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -194,6 +194,7 @@
#include "llstartuplistener.h"
#include "lltoolbarview.h"
#include "llexperiencelog.h"
+#include "llcleanup.h"
#include "llstacktrace.h"
@@ -255,6 +256,7 @@ boost::scoped_ptr<LLViewerStats::PhaseMap> LLStartUp::sPhases(new LLViewerStats:
void login_show();
void login_callback(S32 option, void* userdata);
+void show_release_notes_if_required();
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);
@@ -681,10 +683,17 @@ bool idle_startup()
}
else if (gSavedSettings.getBOOL("AutoLogin"))
{
+ // Log into last account
gRememberPassword = TRUE;
gSavedSettings.setBOOL("RememberPassword", TRUE);
show_connect_box = false;
}
+ else if (gSavedSettings.getLLSD("UserLoginInfo").size() == 3)
+ {
+ // Console provided login&password
+ gRememberPassword = gSavedSettings.getBOOL("RememberPassword");
+ show_connect_box = false;
+ }
else
{
gRememberPassword = gSavedSettings.getBOOL("RememberPassword");
@@ -708,6 +717,7 @@ bool idle_startup()
set_startup_status(0.03f, msg.c_str(), gAgent.mMOTD.c_str());
display_startup();
// LLViewerMedia::initBrowser();
+ show_release_notes_if_required();
LLStartUp::setStartupState( STATE_LOGIN_SHOW );
return FALSE;
}
@@ -2246,6 +2256,22 @@ void login_callback(S32 option, void *userdata)
}
}
+/**
+* Check if user is running a new version of the viewer.
+* Display the Release Notes if it's not overriden by the "UpdaterShowReleaseNotes" setting.
+*/
+void show_release_notes_if_required()
+{
+ if (LLVersionInfo::getChannelAndVersion() != gLastRunVersion
+ && LLVersionInfo::getChannel().find("Test") == std::string::npos // don't show Release Notes for the test builds
+ && gSavedSettings.getBOOL("UpdaterShowReleaseNotes")
+ && !gSavedSettings.getBOOL("FirstLoginThisInstall"))
+ {
+ LLSD info(LLAppViewer::instance()->getViewerInfo());
+ LLWeb::loadURLInternal(info["VIEWER_RELEASE_NOTES_URL"]);
+ }
+}
+
void show_first_run_dialog()
{
LLNotificationsUtil::add("FirstRun", LLSD(), LLSD(), first_run_dialog_callback);
@@ -2811,7 +2837,7 @@ void LLStartUp::initExperiences()
void LLStartUp::cleanupNameCache()
{
- LLAvatarNameCache::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLAvatarNameCache);
delete gCacheName;
gCacheName = NULL;
@@ -3028,7 +3054,7 @@ bool LLStartUp::startLLProxy()
}
else
{
- LL_WARNS("Proxy") << "Invalid other HTTP proxy configuration."<< LL_ENDL;
+ LL_WARNS("Proxy") << "Invalid other HTTP proxy configuration: " << httpProxyType << LL_ENDL;
// Set the missing or wrong configuration back to something valid.
gSavedSettings.setString("HttpProxyType", "None");
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 041eae4b3c..72c5c961aa 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -309,7 +309,7 @@ void LLStatusBar::refresh()
(LLViewerMedia::hasInWorldMedia() || LLViewerMedia::hasParcelMedia() || LLViewerMedia::hasParcelAudio());
mMediaToggle->setEnabled(button_enabled);
// Note the "sense" of the toggle is opposite whether media is playing or not
- bool any_media_playing = (LLViewerMedia::isAnyMediaShowing() ||
+ bool any_media_playing = (LLViewerMedia::isAnyMediaPlaying() ||
LLViewerMedia::isParcelMediaPlaying() ||
LLViewerMedia::isParcelAudioPlaying());
mMediaToggle->setValue(!any_media_playing);
@@ -562,8 +562,8 @@ void LLStatusBar::onClickMediaToggle(void* data)
{
LLStatusBar *status_bar = (LLStatusBar*)data;
// "Selected" means it was showing the "play" icon (so media was playing), and now it shows "pause", so turn off media
- bool enable = ! status_bar->mMediaToggle->getValue();
- LLViewerMedia::setAllMediaEnabled(enable);
+ bool pause = status_bar->mMediaToggle->getValue();
+ LLViewerMedia::setAllMediaPaused(pause);
}
BOOL can_afford_transaction(S32 cost)
diff --git a/indra/newview/llstylemap.h b/indra/newview/llstylemap.h
index 8aa0af535c..96b3920593 100644
--- a/indra/newview/llstylemap.h
+++ b/indra/newview/llstylemap.h
@@ -39,6 +39,7 @@ typedef std::map<LLUUID, LLStyle::Params> style_map_t;
class LLStyleMap : public LLSingleton<LLStyleMap>
{
+ LLSINGLETON_EMPTY_CTOR(LLStyleMap);
public:
// Just like the [] accessor but it will add the entry in if it doesn't exist.
const LLStyle::Params &lookupAgent(const LLUUID &source);
diff --git a/indra/newview/llsyntaxid.cpp b/indra/newview/llsyntaxid.cpp
index 9e54c521b5..10a9dee415 100644
--- a/indra/newview/llsyntaxid.cpp
+++ b/indra/newview/llsyntaxid.cpp
@@ -50,6 +50,7 @@ LLSyntaxIdLSL::LLSyntaxIdLSL()
, mCapabilityURL(std::string())
, mFilePath(LL_PATH_APP_SETTINGS)
, mSyntaxId(LLUUID())
+, mInitialized(false)
{
loadDefaultKeywordsIntoLLSD();
mRegionChangedCallback = gAgent.addRegionChangedCallback(boost::bind(&LLSyntaxIdLSL::handleRegionChanged, this));
@@ -179,6 +180,7 @@ void LLSyntaxIdLSL::cacheFile(const std::string &fileSpec, const LLSD& content_r
//-----------------------------------------------------------------------------
void LLSyntaxIdLSL::initialize()
{
+ if(mInitialized) return;
if (mSyntaxId.isNull())
{
loadDefaultKeywordsIntoLLSD();
@@ -213,6 +215,7 @@ void LLSyntaxIdLSL::initialize()
LL_DEBUGS("SyntaxLSL") << "LSLSyntaxId capability URL is empty." << LL_ENDL;
loadDefaultKeywordsIntoLLSD();
}
+ mInitialized = true;
}
//-----------------------------------------------------------------------------
@@ -303,6 +306,7 @@ void LLSyntaxIdLSL::handleRegionChanged()
{
buildFullFileSpec();
fetchKeywordsFile(mFullFileSpec);
+ mInitialized = false;
}
}
diff --git a/indra/newview/llsyntaxid.h b/indra/newview/llsyntaxid.h
index 0afa6dc04b..caddba5527 100644
--- a/indra/newview/llsyntaxid.h
+++ b/indra/newview/llsyntaxid.h
@@ -38,9 +38,9 @@ class fetchKeywordsFileResponder;
class LLSyntaxIdLSL : public LLSingleton<LLSyntaxIdLSL>
{
- friend class LLSingleton<LLSyntaxIdLSL>;
+ LLSINGLETON(LLSyntaxIdLSL);
friend class fetchKeywordsFileResponder;
-
+
private:
std::set<std::string> mInflightFetches;
typedef boost::signals2::signal<void()> syntax_id_changed_signal_t;
@@ -65,9 +65,9 @@ private:
ELLPath mFilePath;
LLUUID mSyntaxId;
LLSD mKeywordsXml;
+ bool mInitialized;
public:
- LLSyntaxIdLSL();
void initialize();
bool keywordFetchInProgress();
LLSD getKeywordsXML() const { return mKeywordsXml; };
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index d02293e6ff..b96a2573a1 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -32,6 +32,7 @@
#include "llscreenchannel.h"
#include "llsyswellitem.h"
#include "lltransientdockablefloater.h"
+#include "llinitdestroyclass.h"
class LLAvatarName;
class LLChiclet;
diff --git a/indra/newview/llteleporthistory.h b/indra/newview/llteleporthistory.h
index e9c29c39bf..db0ccdda59 100644
--- a/indra/newview/llteleporthistory.h
+++ b/indra/newview/llteleporthistory.h
@@ -73,6 +73,8 @@ public:
*/
class LLTeleportHistory: public LLSingleton<LLTeleportHistory>
{
+ LLSINGLETON(LLTeleportHistory);
+ ~LLTeleportHistory();
LOG_CLASS(LLTeleportHistory);
public:
@@ -81,9 +83,6 @@ public:
typedef boost::function<void()> history_callback_t;
typedef boost::signals2::signal<void()> history_signal_t;
- LLTeleportHistory();
- ~LLTeleportHistory();
-
/**
* Go back in the history.
*/
diff --git a/indra/newview/llteleporthistorystorage.h b/indra/newview/llteleporthistorystorage.h
index cf4c85a991..946ac0af1a 100644
--- a/indra/newview/llteleporthistorystorage.h
+++ b/indra/newview/llteleporthistorystorage.h
@@ -68,6 +68,8 @@ public:
*/
class LLTeleportHistoryStorage: public LLSingleton<LLTeleportHistoryStorage>
{
+ LLSINGLETON(LLTeleportHistoryStorage);
+ ~LLTeleportHistoryStorage();
LOG_CLASS(LLTeleportHistoryStorage);
public:
@@ -78,9 +80,6 @@ public:
typedef boost::function<void(S32 removed_index)> history_callback_t;
typedef boost::signals2::signal<void(S32 removed_index)> history_signal_t;
- LLTeleportHistoryStorage();
- ~LLTeleportHistoryStorage();
-
/**
* @return history items.
*/
diff --git a/indra/newview/lltextureatlasmanager.h b/indra/newview/lltextureatlasmanager.h
index b643056198..1b8df708c6 100644
--- a/indra/newview/lltextureatlasmanager.h
+++ b/indra/newview/lltextureatlasmanager.h
@@ -85,12 +85,11 @@ private:
class LLTextureAtlasManager : public LLSingleton<LLTextureAtlasManager>
{
-private:
+ LLSINGLETON(LLTextureAtlasManager);
+ ~LLTextureAtlasManager();
typedef std::list<LLPointer<LLTextureAtlas> > ll_texture_atlas_list_t ;
public:
- LLTextureAtlasManager();
- ~LLTextureAtlasManager();
LLPointer<LLTextureAtlasSlot> reserveAtlasSlot(S32 sub_texture_size, S8 ncomponents,
LLSpatialGroup* groupp, LLViewerTexture* imagep) ;
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 36c4f0d516..a541273621 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -547,10 +547,18 @@ bool LLTextureCacheRemoteWorker::doWrite()
// 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;
+ if ((mOffset != 0) // We currently do not support write offsets
+ || (mDataSize <= 0) // Things will go badly wrong if mDataSize is nul or negative...
+ || (mImageSize < mDataSize))
+ {
+ LL_WARNS() << "INIT state check failed" << LL_ENDL;
+ mDataSize = -1; // failed
+ done = true;
+ }
+ else
+ {
+ mState = CACHE;
+ }
}
// No LOCAL state for write(): because it doesn't make much sense to cache a local file...
@@ -559,7 +567,7 @@ bool LLTextureCacheRemoteWorker::doWrite()
if (!done && (mState == CACHE))
{
bool alreadyCached = false;
- LLTextureCache::Entry entry ;
+ LLTextureCache::Entry entry;
// Checks if this image is already in the entry list
idx = mCache->getHeaderCacheEntry(mID, entry);
@@ -571,107 +579,132 @@ bool LLTextureCacheRemoteWorker::doWrite()
// (almost always) write to the fast cache.
if (mRawImage->getDataSize())
{
- llassert_always(mCache->writeToFastCache(idx, mRawImage, mRawDiscardLevel));
+ if(!mCache->writeToFastCache(idx, mRawImage, mRawDiscardLevel))
+ {
+ LL_WARNS() << "writeToFastCache failed" << LL_ENDL;
+ mDataSize = -1; // failed
+ done = true;
+ }
+ }
}
}
- }
else
{
alreadyCached = mCache->updateEntry(idx, entry, mImageSize, mDataSize); // update the existing entry.
}
- if (idx < 0)
- {
- LL_WARNS() << "LLTextureCacheWorker: " << mID
- << " Unable to create header entry for writing!" << LL_ENDL;
- mDataSize = -1; // failed
- done = true;
- }
- else
+ if (!done)
{
- if (alreadyCached && (mDataSize <= TEXTURE_CACHE_ENTRY_SIZE))
+ if (idx < 0)
{
- // Small texture already cached case: we're done with writing
+ LL_WARNS() << "LLTextureCacheWorker: " << mID
+ << " Unable to create header entry for writing!" << LL_ENDL;
+ mDataSize = -1; // failed
done = true;
}
else
{
- // If the texture has already been cached, we don't resave the header and go directly to the body part
- mState = alreadyCached ? BODY : HEADER;
+ if (alreadyCached && (mDataSize <= TEXTURE_CACHE_ENTRY_SIZE))
+ {
+ // Small texture already cached case: we're done with writing
+ done = true;
+ }
+ else
+ {
+ // If the texture has already been cached, we don't resave the header and go directly to the body part
+ mState = alreadyCached ? BODY : HEADER;
+ }
}
}
}
+
// Third stage / state : write the header record in the header file (texture.cache)
if (!done && (mState == HEADER))
{
- llassert_always(idx >= 0); // we need an entry here or storing the header makes no sense
- S32 offset = idx * TEXTURE_CACHE_ENTRY_SIZE; // skip to the correct spot in the header file
- S32 size = TEXTURE_CACHE_ENTRY_SIZE; // record size is fixed for the header
- S32 bytes_written;
-
- if (mDataSize < TEXTURE_CACHE_ENTRY_SIZE)
+ if (idx < 0) // we need an entry here or storing the header makes no sense
{
- // We need to write a full record in the header cache so, if the amount of data is smaller
- // than a record, we need to transfer the data to a buffer padded with 0 and write that
- U8* padBuffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), TEXTURE_CACHE_ENTRY_SIZE);
- memset(padBuffer, 0, TEXTURE_CACHE_ENTRY_SIZE); // Init with zeros
- memcpy(padBuffer, mWriteData, mDataSize); // Copy the write buffer
- bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, padBuffer, offset, size, mCache->getLocalAPRFilePool());
- FREE_MEM(LLImageBase::getPrivatePool(), padBuffer);
+ LL_WARNS() << "index check failed" << LL_ENDL;
+ mDataSize = -1; // failed
+ done = true;
}
else
{
- // Write the header record (== first TEXTURE_CACHE_ENTRY_SIZE bytes of the raw file) in the header file
- bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, mWriteData, offset, size, mCache->getLocalAPRFilePool());
- }
+ S32 offset = idx * TEXTURE_CACHE_ENTRY_SIZE; // skip to the correct spot in the header file
+ S32 size = TEXTURE_CACHE_ENTRY_SIZE; // record size is fixed for the header
+ S32 bytes_written;
- if (bytes_written <= 0)
- {
- LL_WARNS() << "LLTextureCacheWorker: " << mID
+ if (mDataSize < TEXTURE_CACHE_ENTRY_SIZE)
+ {
+ // We need to write a full record in the header cache so, if the amount of data is smaller
+ // than a record, we need to transfer the data to a buffer padded with 0 and write that
+ U8* padBuffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), TEXTURE_CACHE_ENTRY_SIZE);
+ memset(padBuffer, 0, TEXTURE_CACHE_ENTRY_SIZE); // Init with zeros
+ memcpy(padBuffer, mWriteData, mDataSize); // Copy the write buffer
+ bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, padBuffer, offset, size, mCache->getLocalAPRFilePool());
+ FREE_MEM(LLImageBase::getPrivatePool(), padBuffer);
+ }
+ else
+ {
+ // Write the header record (== first TEXTURE_CACHE_ENTRY_SIZE bytes of the raw file) in the header file
+ bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, mWriteData, offset, size, mCache->getLocalAPRFilePool());
+ }
+
+ if (bytes_written <= 0)
+ {
+ LL_WARNS() << "LLTextureCacheWorker: " << mID
<< " Unable to write header entry!" << LL_ENDL;
- mDataSize = -1; // failed
- done = true;
- }
+ mDataSize = -1; // failed
+ done = true;
+ }
- // If we wrote everything (may be more with padding) in the header cache,
- // we're done so we don't have a body to store
- if (mDataSize <= bytes_written)
- {
- done = true;
- }
- else
- {
- mState = BODY;
+ // If we wrote everything (may be more with padding) in the header cache,
+ // we're done so we don't have a body to store
+ if (mDataSize <= bytes_written)
+ {
+ done = true;
+ }
+ else
+ {
+ mState = BODY;
+ }
}
}
// Fourth stage / state : write the body file, i.e. the rest of the texture in a "UUID" file name
if (!done && (mState == BODY))
{
- llassert(mDataSize > TEXTURE_CACHE_ENTRY_SIZE); // wouldn't make sense to be here otherwise...
- S32 file_size = mDataSize - TEXTURE_CACHE_ENTRY_SIZE;
-
+ if (mDataSize <= TEXTURE_CACHE_ENTRY_SIZE) // wouldn't make sense to be here otherwise...
{
- // build the cache file name from the UUID
- std::string filename = mCache->getTextureFileName(mID);
-// LL_INFOS() << "Writing Body: " << filename << " Bytes: " << file_offset+file_size << LL_ENDL;
- S32 bytes_written = LLAPRFile::writeEx( filename,
- mWriteData + TEXTURE_CACHE_ENTRY_SIZE,
- 0, file_size,
- mCache->getLocalAPRFilePool());
- if (bytes_written <= 0)
+ LL_WARNS() << "mDataSize check failed" << LL_ENDL;
+ mDataSize = -1; // failed
+ done = true;
+ }
+ else
+ {
+ S32 file_size = mDataSize - TEXTURE_CACHE_ENTRY_SIZE;
+
{
- LL_WARNS() << "LLTextureCacheWorker: " << mID
+ // build the cache file name from the UUID
+ std::string filename = mCache->getTextureFileName(mID);
+ // LL_INFOS() << "Writing Body: " << filename << " Bytes: " << file_offset+file_size << LL_ENDL;
+ S32 bytes_written = LLAPRFile::writeEx(filename,
+ mWriteData + TEXTURE_CACHE_ENTRY_SIZE,
+ 0, file_size,
+ mCache->getLocalAPRFilePool());
+ if (bytes_written <= 0)
+ {
+ LL_WARNS() << "LLTextureCacheWorker: " << mID
<< " incorrect number of bytes written to body: " << bytes_written
<< " / " << file_size << LL_ENDL;
- mDataSize = -1; // failed
- done = true;
+ mDataSize = -1; // failed
+ done = true;
+ }
}
+
+ // Nothing else to do at that point...
+ done = true;
}
-
- // Nothing else to do at that point...
- done = true;
}
mRawImage = NULL;
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 24bc55c998..c7adaa908f 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -43,7 +43,6 @@
#include "llinventorymodelbackgroundfetch.h"
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
-#include "llfloaterinventory.h"
#include "lllineeditor.h"
#include "llui.h"
#include "llviewerinventory.h"
@@ -565,7 +564,7 @@ void LLFloaterTexturePicker::draw()
}
}
-const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, BOOL copyable_only)
+const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, BOOL copyable_only, BOOL ignore_library)
{
LLViewerInventoryCategory::cat_array_t cats;
LLViewerInventoryItem::item_array_t items;
@@ -585,7 +584,10 @@ const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, BOOL co
LLPermissions item_permissions = itemp->getPermissions();
if (item_permissions.allowCopyBy(gAgent.getID(), gAgent.getGroupID()))
{
- return itemp->getUUID();
+ if(!ignore_library || !gInventory.isObjectDescendentOf(itemp->getUUID(),gInventory.getLibraryRootFolderID()))
+ {
+ return itemp->getUUID();
+ }
}
}
// otherwise just return first instance, unless copyable requested
@@ -595,7 +597,10 @@ const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, BOOL co
}
else
{
- return items[0]->getUUID();
+ if(!ignore_library || !gInventory.isObjectDescendentOf(items[0]->getUUID(),gInventory.getLibraryRootFolderID()))
+ {
+ return items[0]->getUUID();
+ }
}
}
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index 61f99de5c0..840feddfaf 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -278,7 +278,7 @@ public:
void setImageID(const LLUUID& image_asset_id, bool set_selection = true);
void updateImageStats();
const LLUUID& getAssetID() { return mImageAssetID; }
- const LLUUID& findItemID(const LLUUID& asset_id, BOOL copyable_only);
+ const LLUUID& findItemID(const LLUUID& asset_id, BOOL copyable_only, BOOL ignore_library = FALSE);
void setCanApplyImmediately(BOOL b);
void setActive(BOOL active);
diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp
index f6ca0bc9d7..f7dc32d0d7 100644
--- a/indra/newview/lltoastgroupnotifypanel.cpp
+++ b/indra/newview/lltoastgroupnotifypanel.cpp
@@ -47,7 +47,6 @@
#include "llglheaders.h"
#include "llagent.h"
#include "llavatariconctrl.h"
-#include "llfloaterinventory.h"
#include "llinventorytype.h"
const S32 LLToastGroupNotifyPanel::DEFAULT_MESSAGE_MAX_LINE_COUNT = 7;
diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp
index 5e703933ca..4aad650b68 100644
--- a/indra/newview/lltool.cpp
+++ b/indra/newview/lltool.cpp
@@ -38,7 +38,6 @@
#include "lltoolfocus.h"
#include "llfocusmgr.h"
#include "llagent.h"
-#include "llagentcamera.h"
#include "llviewerjoystick.h"
extern BOOL gDebugClicks;
@@ -85,14 +84,7 @@ BOOL LLTool::handleMouseDown(S32 x, S32 y, MASK mask)
}
// by default, didn't handle it
// LL_INFOS() << "LLTool::handleMouseDown" << LL_ENDL;
- if (gAgentCamera.cameraMouselook())
- {
- gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN);
- }
- else
- {
- gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_DOWN);
- }
+ gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_DOWN);
return TRUE;
}
@@ -103,15 +95,8 @@ BOOL LLTool::handleMouseUp(S32 x, S32 y, MASK mask)
LL_INFOS() << "LLTool left mouse up" << LL_ENDL;
}
// by default, didn't handle it
- // LL_INFOS() << "LLTool::handleMouseUp" << LL_ENDL;
- if (gAgentCamera.cameraMouselook())
- {
- gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_UP);
- }
- else
- {
- gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_UP);
- }
+ // LL_INFOS() << "LLTool::handleMouseUp" << LL_ENDL;
+ gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_UP);
return TRUE;
}
diff --git a/indra/newview/lltoolbrush.h b/indra/newview/lltoolbrush.h
index 2ec6911de9..c108d83256 100644
--- a/indra/newview/lltoolbrush.h
+++ b/indra/newview/lltoolbrush.h
@@ -43,10 +43,10 @@ class LLViewerRegion;
class LLToolBrushLand : public LLTool, public LLEditMenuHandler, public LLSingleton<LLToolBrushLand>
{
+ LLSINGLETON(LLToolBrushLand);
typedef std::set<LLViewerRegion*> region_list_t;
public:
- LLToolBrushLand();
// x,y in window coords, 0,0 = left,bot
virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp
index 2b4fa757f6..392c103d7c 100644
--- a/indra/newview/lltoolcomp.cpp
+++ b/indra/newview/lltoolcomp.cpp
@@ -683,7 +683,7 @@ LLToolCompGun::LLToolCompGun()
: LLToolComposite(std::string("Mouselook"))
{
mGun = new LLToolGun(this);
- mGrab = new LLToolGrab(this);
+ mGrab = new LLToolGrabBase(this);
mNull = sNullTool;
setCurrentTool(mGun);
@@ -742,13 +742,12 @@ BOOL LLToolCompGun::handleHover(S32 x, S32 y, MASK mask)
BOOL LLToolCompGun::handleMouseDown(S32 x, S32 y, MASK mask)
{
- // if the left button is blocked, don't put up the pie menu
- if (gAgent.leftButtonBlocked())
- {
- // in case of "grabbed" control flag will be set later
- gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN);
- return FALSE;
- }
+ // if the left button is grabbed, don't put up the pie menu
+ if (gAgent.leftButtonGrabbed())
+ {
+ gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN);
+ return FALSE;
+ }
// On mousedown, start grabbing
gGrabTransientTool = this;
@@ -760,13 +759,12 @@ BOOL LLToolCompGun::handleMouseDown(S32 x, S32 y, MASK mask)
BOOL LLToolCompGun::handleDoubleClick(S32 x, S32 y, MASK mask)
{
- // if the left button is blocked, don't put up the pie menu
- if (gAgent.leftButtonBlocked())
- {
- // in case of "grabbed" control flag will be set later
- gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN);
- return FALSE;
- }
+ // if the left button is grabbed, don't put up the pie menu
+ if (gAgent.leftButtonGrabbed())
+ {
+ gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN);
+ return FALSE;
+ }
// On mousedown, start grabbing
gGrabTransientTool = this;
diff --git a/indra/newview/lltoolcomp.h b/indra/newview/lltoolcomp.h
index e75d3c22e2..86506f725e 100644
--- a/indra/newview/lltoolcomp.h
+++ b/indra/newview/lltoolcomp.h
@@ -103,9 +103,9 @@ public:
class LLToolCompInspect : public LLToolComposite, public LLSingleton<LLToolCompInspect>
{
-public:
- LLToolCompInspect();
+ LLSINGLETON(LLToolCompInspect);
virtual ~LLToolCompInspect();
+public:
// Overridden from LLToolComposite
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
@@ -128,9 +128,9 @@ private:
class LLToolCompTranslate : public LLToolComposite, public LLSingleton<LLToolCompTranslate>
{
-public:
- LLToolCompTranslate();
+ LLSINGLETON(LLToolCompTranslate);
virtual ~LLToolCompTranslate();
+public:
// Overridden from LLToolComposite
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
@@ -149,9 +149,9 @@ public:
class LLToolCompScale : public LLToolComposite, public LLSingleton<LLToolCompScale>
{
-public:
- LLToolCompScale();
+ LLSINGLETON(LLToolCompScale);
virtual ~LLToolCompScale();
+public:
// Overridden from LLToolComposite
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
@@ -171,9 +171,9 @@ public:
class LLToolCompRotate : public LLToolComposite, public LLSingleton<LLToolCompRotate>
{
-public:
- LLToolCompRotate();
+ LLSINGLETON(LLToolCompRotate);
virtual ~LLToolCompRotate();
+public:
// Overridden from LLToolComposite
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
@@ -194,9 +194,9 @@ protected:
class LLToolCompCreate : public LLToolComposite, public LLSingleton<LLToolCompCreate>
{
-public:
- LLToolCompCreate();
+ LLSINGLETON(LLToolCompCreate);
virtual ~LLToolCompCreate();
+public:
// Overridden from LLToolComposite
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
@@ -214,14 +214,14 @@ protected:
// LLToolCompGun
class LLToolGun;
-class LLToolGrab;
+class LLToolGrabBase;
class LLToolSelect;
class LLToolCompGun : public LLToolComposite, public LLSingleton<LLToolCompGun>
{
-public:
- LLToolCompGun();
+ LLSINGLETON(LLToolCompGun);
virtual ~LLToolCompGun();
+public:
// Overridden from LLToolComposite
virtual BOOL handleHover(S32 x, S32 y, MASK mask);
@@ -237,7 +237,7 @@ public:
protected:
LLToolGun* mGun;
- LLToolGrab* mGrab;
+ LLToolGrabBase* mGrab;
LLTool* mNull;
};
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index 63be1ef09b..766046785b 100644
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -43,11 +43,10 @@ class LLPickInfo;
class LLToolDragAndDrop : public LLTool, public LLSingleton<LLToolDragAndDrop>
{
+ LLSINGLETON(LLToolDragAndDrop);
public:
typedef boost::signals2::signal<void ()> enddrag_signal_t;
- LLToolDragAndDrop();
-
// overridden from LLTool
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
virtual BOOL handleHover(S32 x, S32 y, MASK mask);
@@ -281,8 +280,8 @@ private:
class LLDragAndDropDictionary : public LLSingleton<LLDragAndDropDictionary>,
public LLDictionary<EDragAndDropType, DragAndDropEntry>
{
+ LLSINGLETON(LLDragAndDropDictionary);
public:
- LLDragAndDropDictionary();
dragOrDrop3dImpl get(EDragAndDropType dad_type, EDropTarget drop_target);
};
};
diff --git a/indra/newview/lltoolface.h b/indra/newview/lltoolface.h
index 7eb13b0fbc..e4b8ae12b8 100644
--- a/indra/newview/lltoolface.h
+++ b/indra/newview/lltoolface.h
@@ -35,9 +35,9 @@ class LLPickInfo;
class LLToolFace
: public LLTool, public LLSingleton<LLToolFace>
{
-public:
- LLToolFace();
+ LLSINGLETON(LLToolFace);
virtual ~LLToolFace();
+public:
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/lltoolfocus.h b/indra/newview/lltoolfocus.h
index d23eb2cce6..cfc235b6c2 100644
--- a/indra/newview/lltoolfocus.h
+++ b/indra/newview/lltoolfocus.h
@@ -34,9 +34,9 @@ class LLPickInfo;
class LLToolCamera
: public LLTool, public LLSingleton<LLToolCamera>
{
-public:
- LLToolCamera();
+ LLSINGLETON(LLToolCamera);
virtual ~LLToolCamera();
+public:
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp
index c0ca4d7a9a..5623036b91 100644
--- a/indra/newview/lltoolgrab.cpp
+++ b/indra/newview/lltoolgrab.cpp
@@ -69,7 +69,7 @@ extern BOOL gDebugClicks;
//
// Methods
//
-LLToolGrab::LLToolGrab( LLToolComposite* composite )
+LLToolGrabBase::LLToolGrabBase( LLToolComposite* composite )
: LLTool( std::string("Grab"), composite ),
mMode( GRAB_INACTIVE ),
mVerticalDragging( FALSE ),
@@ -88,12 +88,12 @@ LLToolGrab::LLToolGrab( LLToolComposite* composite )
mHideBuildHighlight(FALSE)
{ }
-LLToolGrab::~LLToolGrab()
+LLToolGrabBase::~LLToolGrabBase()
{ }
// virtual
-void LLToolGrab::handleSelect()
+void LLToolGrabBase::handleSelect()
{
if(gFloaterTools)
{
@@ -106,7 +106,7 @@ void LLToolGrab::handleSelect()
gGrabBtnSpin = FALSE;
}
-void LLToolGrab::handleDeselect()
+void LLToolGrabBase::handleDeselect()
{
if( hasMouseCapture() )
{
@@ -123,7 +123,7 @@ void LLToolGrab::handleDeselect()
}
-BOOL LLToolGrab::handleDoubleClick(S32 x, S32 y, MASK mask)
+BOOL LLToolGrabBase::handleDoubleClick(S32 x, S32 y, MASK mask)
{
if (gDebugClicks)
{
@@ -133,7 +133,7 @@ BOOL LLToolGrab::handleDoubleClick(S32 x, S32 y, MASK mask)
return FALSE;
}
-BOOL LLToolGrab::handleMouseDown(S32 x, S32 y, MASK mask)
+BOOL LLToolGrabBase::handleMouseDown(S32 x, S32 y, MASK mask)
{
if (gDebugClicks)
{
@@ -143,7 +143,7 @@ BOOL LLToolGrab::handleMouseDown(S32 x, S32 y, MASK mask)
// call the base class to propogate info to sim
LLTool::handleMouseDown(x, y, mask);
- if (!gAgent.leftButtonBlocked())
+ if (!gAgent.leftButtonGrabbed())
{
// can grab transparent objects (how touch event propagates, scripters rely on this)
gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ TRUE);
@@ -152,7 +152,7 @@ BOOL LLToolGrab::handleMouseDown(S32 x, S32 y, MASK mask)
return TRUE;
}
-void LLToolGrab::pickCallback(const LLPickInfo& pick_info)
+void LLToolGrabBase::pickCallback(const LLPickInfo& pick_info)
{
LLToolGrab::getInstance()->mGrabPick = pick_info;
LLViewerObject *objectp = pick_info.getObject();
@@ -182,7 +182,7 @@ void LLToolGrab::pickCallback(const LLPickInfo& pick_info)
}
}
-BOOL LLToolGrab::handleObjectHit(const LLPickInfo& info)
+BOOL LLToolGrabBase::handleObjectHit(const LLPickInfo& info)
{
mGrabPick = info;
LLViewerObject* objectp = mGrabPick.getObject();
@@ -315,7 +315,7 @@ BOOL LLToolGrab::handleObjectHit(const LLPickInfo& info)
}
-void LLToolGrab::startSpin()
+void LLToolGrabBase::startSpin()
{
LLViewerObject* objectp = mGrabPick.getObject();
if (!objectp)
@@ -339,7 +339,7 @@ void LLToolGrab::startSpin()
}
-void LLToolGrab::stopSpin()
+void LLToolGrabBase::stopSpin()
{
mSpinGrabbing = FALSE;
@@ -373,7 +373,7 @@ void LLToolGrab::stopSpin()
}
-void LLToolGrab::startGrab()
+void LLToolGrabBase::startGrab()
{
// Compute grab_offset in the OBJECT's root's coordinate frame
// (sometimes root == object)
@@ -422,7 +422,7 @@ void LLToolGrab::startGrab()
}
-BOOL LLToolGrab::handleHover(S32 x, S32 y, MASK mask)
+BOOL LLToolGrabBase::handleHover(S32 x, S32 y, MASK mask)
{
if (!gViewerWindow->getLeftMouseDown())
{
@@ -466,7 +466,7 @@ const F32 GRAB_SENSITIVITY_Y = 0.0075f;
// Dragging.
-void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
+void LLToolGrabBase::handleHoverActive(S32 x, S32 y, MASK mask)
{
LLViewerObject* objectp = mGrabPick.getObject();
if (!objectp || !hasMouseCapture() ) return;
@@ -724,7 +724,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
}
-void LLToolGrab::handleHoverNonPhysical(S32 x, S32 y, MASK mask)
+void LLToolGrabBase::handleHoverNonPhysical(S32 x, S32 y, MASK mask)
{
LLViewerObject* objectp = mGrabPick.getObject();
if (!objectp || !hasMouseCapture() ) return;
@@ -881,7 +881,7 @@ void LLToolGrab::handleHoverNonPhysical(S32 x, S32 y, MASK mask)
// Not dragging. Just showing affordances
-void LLToolGrab::handleHoverInactive(S32 x, S32 y, MASK mask)
+void LLToolGrabBase::handleHoverInactive(S32 x, S32 y, MASK mask)
{
// JC - TODO - change cursor based on gGrabBtnVertical, gGrabBtnSpin
LL_DEBUGS("UserInput") << "hover handled by LLToolGrab (inactive-not over editable object)" << LL_ENDL;
@@ -889,7 +889,7 @@ void LLToolGrab::handleHoverInactive(S32 x, S32 y, MASK mask)
}
// User is trying to do something that's not allowed.
-void LLToolGrab::handleHoverFailed(S32 x, S32 y, MASK mask)
+void LLToolGrabBase::handleHoverFailed(S32 x, S32 y, MASK mask)
{
if( GRAB_NOOBJECT == mMode )
{
@@ -930,7 +930,7 @@ void LLToolGrab::handleHoverFailed(S32 x, S32 y, MASK mask)
-BOOL LLToolGrab::handleMouseUp(S32 x, S32 y, MASK mask)
+BOOL LLToolGrabBase::handleMouseUp(S32 x, S32 y, MASK mask)
{
// call the base class to propogate info to sim
LLTool::handleMouseUp(x, y, mask);
@@ -961,7 +961,7 @@ BOOL LLToolGrab::handleMouseUp(S32 x, S32 y, MASK mask)
return TRUE;
}
-void LLToolGrab::stopEditing()
+void LLToolGrabBase::stopEditing()
{
if( hasMouseCapture() )
{
@@ -969,7 +969,7 @@ void LLToolGrab::stopEditing()
}
}
-void LLToolGrab::onMouseCaptureLost()
+void LLToolGrabBase::onMouseCaptureLost()
{
LLViewerObject* objectp = mGrabPick.getObject();
if (!objectp)
@@ -1026,7 +1026,7 @@ void LLToolGrab::onMouseCaptureLost()
}
-void LLToolGrab::stopGrab()
+void LLToolGrabBase::stopGrab()
{
LLViewerObject* objectp = mGrabPick.getObject();
if (!objectp)
@@ -1067,29 +1067,29 @@ void LLToolGrab::stopGrab()
}
-void LLToolGrab::draw()
+void LLToolGrabBase::draw()
{ }
-void LLToolGrab::render()
+void LLToolGrabBase::render()
{ }
-BOOL LLToolGrab::isEditing()
+BOOL LLToolGrabBase::isEditing()
{
return (mGrabPick.getObject().notNull());
}
-LLViewerObject* LLToolGrab::getEditingObject()
+LLViewerObject* LLToolGrabBase::getEditingObject()
{
return mGrabPick.getObject();
}
-LLVector3d LLToolGrab::getEditingPointGlobal()
+LLVector3d LLToolGrabBase::getEditingPointGlobal()
{
return getGrabPointGlobal();
}
-LLVector3d LLToolGrab::getGrabPointGlobal()
+LLVector3d LLToolGrabBase::getGrabPointGlobal()
{
switch(mMode)
{
diff --git a/indra/newview/lltoolgrab.h b/indra/newview/lltoolgrab.h
index 5d24c8813e..02ed5c26d7 100644
--- a/indra/newview/lltoolgrab.h
+++ b/indra/newview/lltoolgrab.h
@@ -45,12 +45,17 @@ void send_ObjectGrab_message(LLViewerObject* object, const LLPickInfo & pick, co
void send_ObjectDeGrab_message(LLViewerObject* object, const LLPickInfo & pick);
-
-class LLToolGrab : public LLTool, public LLSingleton<LLToolGrab>
+/**
+ * LLToolGrabBase contains most of the semantics of LLToolGrab. It's just that
+ * LLToolGrab is an LLSingleton, but we also explicitly instantiate
+ * LLToolGrabBase as part of LLToolCompGun. You can't just make an extra
+ * instance of an LLSingleton!
+ */
+class LLToolGrabBase : public LLTool
{
public:
- LLToolGrab( LLToolComposite* composite = NULL );
- ~LLToolGrab();
+ LLToolGrabBase(LLToolComposite* composite=NULL);
+ ~LLToolGrabBase();
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
@@ -140,10 +145,14 @@ private:
BOOL mClickedInMouselook;
};
+/// This is the LLSingleton instance of LLToolGrab.
+class LLToolGrab : public LLToolGrabBase, public LLSingleton<LLToolGrab>
+{
+ LLSINGLETON_EMPTY_CTOR(LLToolGrab);
+};
+
extern BOOL gGrabBtnVertical;
extern BOOL gGrabBtnSpin;
extern LLTool* gGrabTransientTool;
#endif // LL_TOOLGRAB_H
-
-
diff --git a/indra/newview/lltoolindividual.h b/indra/newview/lltoolindividual.h
index 961a6a4d93..e7c2060fba 100644
--- a/indra/newview/lltoolindividual.h
+++ b/indra/newview/lltoolindividual.h
@@ -39,9 +39,9 @@ class LLPickInfo;
class LLToolIndividual : public LLTool, public LLSingleton<LLToolIndividual>
{
-public:
- LLToolIndividual();
+ LLSINGLETON(LLToolIndividual);
virtual ~LLToolIndividual();
+public:
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/lltoolmgr.h b/indra/newview/lltoolmgr.h
index e5b45750d9..28465d5d2c 100644
--- a/indra/newview/lltoolmgr.h
+++ b/indra/newview/lltoolmgr.h
@@ -42,9 +42,9 @@ const MASK MASK_COPY = MASK_SHIFT;
class LLToolMgr : public LLSingleton<LLToolMgr>
{
-public:
- LLToolMgr();
+ LLSINGLETON(LLToolMgr);
~LLToolMgr();
+public:
// Must be called after gSavedSettings set up.
void initTools();
diff --git a/indra/newview/lltoolobjpicker.h b/indra/newview/lltoolobjpicker.h
index 0c37be1f92..5ad9b67e21 100644
--- a/indra/newview/lltoolobjpicker.h
+++ b/indra/newview/lltoolobjpicker.h
@@ -35,8 +35,8 @@ class LLPickInfo;
class LLToolObjPicker : public LLTool, public LLSingleton<LLToolObjPicker>
{
+ LLSINGLETON(LLToolObjPicker);
public:
- LLToolObjPicker();
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index e17651dc91..e79ce55854 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -338,56 +338,41 @@ BOOL LLToolPie::handleLeftClickPick()
// If left-click never selects or spawns a menu
// Eat the event.
- if (!gSavedSettings.getBOOL("LeftClickShowMenu"))
+
+ // mouse already released
+ if (!mMouseButtonDown)
{
- // mouse already released
- if (!mMouseButtonDown)
- {
- return true;
- }
+ return true;
+ }
- while( object && object->isAttachment() && !object->flagHandleTouch())
+ while (object && object->isAttachment() && !object->flagHandleTouch())
+ {
+ // don't pick avatar through hud attachment
+ if (object->isHUDAttachment())
{
- // don't pick avatar through hud attachment
- if (object->isHUDAttachment())
- {
- break;
- }
- object = (LLViewerObject*)object->getParent();
+ break;
}
- if (object && object == gAgentAvatarp && !gSavedSettings.getBOOL("ClickToWalk"))
- {
- // we left clicked on avatar, switch to focus mode
- mMouseButtonDown = false;
- LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance());
- gViewerWindow->hideCursor();
- LLToolCamera::getInstance()->setMouseCapture(TRUE);
- LLToolCamera::getInstance()->pickCallback(mPick);
- gAgentCamera.setFocusOnAvatar(TRUE, TRUE);
+ object = (LLViewerObject*)object->getParent();
+ }
+ if (object && object == gAgentAvatarp && !gSavedSettings.getBOOL("ClickToWalk"))
+ {
+ // we left clicked on avatar, switch to focus mode
+ mMouseButtonDown = false;
+ LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance());
+ gViewerWindow->hideCursor();
+ LLToolCamera::getInstance()->setMouseCapture(TRUE);
+ LLToolCamera::getInstance()->pickCallback(mPick);
+ gAgentCamera.setFocusOnAvatar(TRUE, TRUE);
- return TRUE;
- }
+ return TRUE;
+ }
//////////
// // Could be first left-click on nothing
// LLFirstUse::useLeftClickNoHit();
/////////
-
- // Eat the event
- return LLTool::handleMouseDown(x, y, mask);
- }
-
- if (gAgent.leftButtonGrabbed())
- {
- // if the left button is grabbed, don't put up the pie menu
- return LLTool::handleMouseDown(x, y, mask);
- }
-
- // Can't ignore children here.
- LLToolSelect::handleObjectSelection(mPick, FALSE, TRUE);
- // Spawn pie menu
- LLTool::handleRightMouseDown(x, y, mask);
- return TRUE;
+ // Eat the event
+ return LLTool::handleMouseDown(x, y, mask);
}
BOOL LLToolPie::useClickAction(MASK mask,
diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h
index 6391e675c5..95d155a474 100644
--- a/indra/newview/lltoolpie.h
+++ b/indra/newview/lltoolpie.h
@@ -37,9 +37,9 @@ class LLObjectSelection;
class LLToolPie : public LLTool, public LLSingleton<LLToolPie>
{
+ LLSINGLETON(LLToolPie);
LOG_CLASS(LLToolPie);
public:
- LLToolPie( );
// Virtual functions inherited from LLMouseHandler
virtual BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down);
diff --git a/indra/newview/lltoolpipette.h b/indra/newview/lltoolpipette.h
index 8a83bf31af..7575d8ad18 100644
--- a/indra/newview/lltoolpipette.h
+++ b/indra/newview/lltoolpipette.h
@@ -43,10 +43,10 @@ class LLPickInfo;
class LLToolPipette
: public LLTool, public LLSingleton<LLToolPipette>
{
-public:
- LLToolPipette();
+ LLSINGLETON(LLToolPipette);
virtual ~LLToolPipette();
+public:
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
virtual BOOL handleHover(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/lltoolselectland.h b/indra/newview/lltoolselectland.h
index b368a4b153..b5ba72f16d 100644
--- a/indra/newview/lltoolselectland.h
+++ b/indra/newview/lltoolselectland.h
@@ -35,10 +35,10 @@ class LLParcelSelection;
class LLToolSelectLand
: public LLTool, public LLSingleton<LLToolSelectLand>
{
-public:
- LLToolSelectLand( );
+ LLSINGLETON(LLToolSelectLand);
virtual ~LLToolSelectLand();
+public:
/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/lltransientfloatermgr.h b/indra/newview/lltransientfloatermgr.h
index b4611c8c87..d126543f15 100644
--- a/indra/newview/lltransientfloatermgr.h
+++ b/indra/newview/lltransientfloatermgr.h
@@ -38,9 +38,7 @@ class LLTransientFloater;
*/
class LLTransientFloaterMgr: public LLSingleton<LLTransientFloaterMgr>
{
-protected:
- LLTransientFloaterMgr();
- friend class LLSingleton<LLTransientFloaterMgr>;
+ LLSINGLETON(LLTransientFloaterMgr);
public:
enum ETransientGroup
diff --git a/indra/newview/lltwitterconnect.h b/indra/newview/lltwitterconnect.h
index be481a17c1..e77048cc35 100644
--- a/indra/newview/lltwitterconnect.h
+++ b/indra/newview/lltwitterconnect.h
@@ -43,6 +43,7 @@ class LLEventPump;
*/
class LLTwitterConnect : public LLSingleton<LLTwitterConnect>
{
+ LLSINGLETON(LLTwitterConnect);
LOG_CLASS(LLTwitterConnect);
public:
enum EConnectionState
@@ -81,10 +82,7 @@ public:
void openTwitterWeb(std::string url);
private:
- friend class LLSingleton<LLTwitterConnect>;
- LLTwitterConnect();
- ~LLTwitterConnect() {};
std::string getTwitterConnectURL(const std::string& route = "", bool include_read_from_master = false);
EConnectionState mConnectionState;
diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp
index 08ba5a5f25..ad0c1734f9 100644
--- a/indra/newview/llviewerassettype.cpp
+++ b/indra/newview/llviewerassettype.cpp
@@ -48,8 +48,7 @@ struct ViewerAssetEntry : public LLDictionaryEntry
class LLViewerAssetDictionary : public LLSingleton<LLViewerAssetDictionary>,
public LLDictionary<LLViewerAssetType::EType, ViewerAssetEntry>
{
-public:
- LLViewerAssetDictionary();
+ LLSINGLETON(LLViewerAssetDictionary);
};
LLViewerAssetDictionary::LLViewerAssetDictionary()
diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp
index 94f1b09fa9..49d29c0e4e 100644
--- a/indra/newview/llviewerassetupload.cpp
+++ b/indra/newview/llviewerassetupload.cpp
@@ -174,7 +174,7 @@ S32 LLResourceUploadInfo::getEconomyUploadCost()
getAssetType() == LLAssetType::AT_ANIMATION ||
getAssetType() == LLAssetType::AT_MESH)
{
- return LLGlobalEconomy::Singleton::instance().getPriceUpload();
+ return LLGlobalEconomy::instance().getPriceUpload();
}
return 0;
@@ -307,10 +307,9 @@ void LLResourceUploadInfo::assignDefaults()
mDescription = "(No Description)";
}
- mFolderId = gInventory.findCategoryUUIDForType(
+ mFolderId = gInventory.findUserDefinedCategoryUUIDForType(
(mDestinationFolderType == LLFolderType::FT_NONE) ?
(LLFolderType::EType)mAssetType : mDestinationFolderType);
-
}
std::string LLResourceUploadInfo::getDisplayName() const
@@ -824,8 +823,15 @@ void LLViewerAssetUpload::HandleUploadError(LLCore::HttpStatus status, LLSD &res
}
LLSD args;
- args["FILE"] = uploadInfo->getDisplayName();
- args["REASON"] = reason;
+ if(label == "ErrorMessage")
+ {
+ args["ERROR_MESSAGE"] = reason;
+ }
+ else
+ {
+ args["FILE"] = uploadInfo->getDisplayName();
+ args["REASON"] = reason;
+ }
LLNotificationsUtil::add(label, args);
diff --git a/indra/newview/llvieweraudio.h b/indra/newview/llvieweraudio.h
index 8c302c6549..16f9b63113 100644
--- a/indra/newview/llvieweraudio.h
+++ b/indra/newview/llvieweraudio.h
@@ -43,6 +43,9 @@ void audio_update_wind(bool force_update = true);
class LLViewerAudio : public LLSingleton<LLViewerAudio>
{
+ LLSINGLETON(LLViewerAudio);
+ virtual ~LLViewerAudio();
+
public:
enum EFadeState
@@ -52,9 +55,6 @@ public:
FADE_OUT,
};
- LLViewerAudio();
- virtual ~LLViewerAudio();
-
void startInternetStreamWithAutoFade(std::string streamURI);
void stopInternetStreamWithAutoFade();
diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h
index 7b2887d725..f8c973690a 100644
--- a/indra/newview/llviewercamera.h
+++ b/indra/newview/llviewercamera.h
@@ -54,6 +54,7 @@ extern template class LLViewerCamera* LLSingleton<class LLViewerCamera>::getInst
LL_ALIGN_PREFIX(16)
class LLViewerCamera : public LLCamera, public LLSingleton<LLViewerCamera>
{
+ LLSINGLETON(LLViewerCamera);
public:
void* operator new(size_t size)
{
@@ -82,8 +83,6 @@ public:
static eCameraID sCurCameraID;
- LLViewerCamera();
-
void updateCameraLocation(const LLVector3 &center,
const LLVector3 &up_direction,
const LLVector3 &point_of_interest);
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index db71849659..7c1921b143 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -507,7 +507,7 @@ bool handleVelocityInterpolate(const LLSD& newvalue)
bool handleForceShowGrid(const LLSD& newvalue)
{
- LLPanelLogin::updateServer( );
+ LLPanelLogin::updateLocationSelectorsVisibility();
return true;
}
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 6d13d28e18..ec7a81584a 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -77,7 +77,6 @@
#include "llfloaterimagepreview.h"
#include "llfloaterimsession.h"
#include "llfloaterinspect.h"
-#include "llfloaterinventory.h"
#include "llfloaterjoystick.h"
#include "llfloaterlagmeter.h"
#include "llfloaterland.h"
@@ -93,6 +92,7 @@
#include "llfloaternotificationstabbed.h"
#include "llfloaterobjectweights.h"
#include "llfloateropenobject.h"
+#include "llfloateroutfitphotopreview.h"
#include "llfloateroutfitsnapshot.h"
#include "llfloaterpathfindingcharacters.h"
#include "llfloaterpathfindingconsole.h"
@@ -277,6 +277,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("object_weights", "floater_object_weights.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterObjectWeights>);
LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>);
LLFloaterReg::add("outgoing_call", "floater_outgoing_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutgoingCallDialog>);
+ LLFloaterReg::add("outfit_photo_preview", "floater_outfit_photo_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOutfitPhotoPreview>);
LLFloaterPayUtil::registerFloater();
LLFloaterReg::add("pathfinding_characters", "floater_pathfinding_characters.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingCharacters>);
diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp
index b8ff2cc9b4..9cb2e0336a 100644
--- a/indra/newview/llviewerfoldertype.cpp
+++ b/indra/newview/llviewerfoldertype.cpp
@@ -103,8 +103,7 @@ struct ViewerFolderEntry : public LLDictionaryEntry
class LLViewerFolderDictionary : public LLSingleton<LLViewerFolderDictionary>,
public LLDictionary<LLFolderType::EType, ViewerFolderEntry>
{
-public:
- LLViewerFolderDictionary();
+ LLSINGLETON(LLViewerFolderDictionary);
protected:
bool initEnsemblesFromFile(); // Reads in ensemble information from foldertypes.xml
};
diff --git a/indra/newview/llviewerhelp.h b/indra/newview/llviewerhelp.h
index a983012e2e..da50e07a43 100644
--- a/indra/newview/llviewerhelp.h
+++ b/indra/newview/llviewerhelp.h
@@ -39,7 +39,7 @@ class LLUICtrl;
class LLViewerHelp : public LLHelp, public LLSingleton<LLViewerHelp>
{
- friend class LLSingleton<LLViewerHelp>;
+ LLSINGLETON_EMPTY_CTOR(LLViewerHelp);
public:
/// display the specified help topic in the help viewer
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 0bbe9fa2c2..caffeadb73 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -49,7 +49,6 @@
#include "llinventorybridge.h"
#include "llinventorypanel.h"
-#include "llfloaterinventory.h"
#include "lllandmarkactions.h"
#include "llviewerassettype.h"
@@ -94,107 +93,10 @@ void doInventoryCb(LLPointer<LLInventoryCallback> cb, LLUUID id)
///----------------------------------------------------------------------------
class LLLocalizedInventoryItemsDictionary : public LLSingleton<LLLocalizedInventoryItemsDictionary>
{
+ 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["New Physics"] = LLTrans::getString("New Physics");
- mInventoryItemsDict["Invalid Wearable"] = LLTrans::getString("Invalid Wearable");
-
- mInventoryItemsDict["New Gesture"] = LLTrans::getString("New Gesture");
- mInventoryItemsDict["New Script"] = LLTrans::getString("New Script");
- mInventoryItemsDict["New Folder"] = LLTrans::getString("New Folder");
- mInventoryItemsDict["New Note"] = LLTrans::getString("New Note");
- 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"); // double space after Male. EXT-8319
- 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 - Chuckle"] = LLTrans::getString("Female - Chuckle");
- mInventoryItemsDict["Female - Cry"] = LLTrans::getString("Female - Cry");
- mInventoryItemsDict["Female - Embarrassed"] = LLTrans::getString("Female - Embarrassed");
- mInventoryItemsDict["Female - Excuse me"] = LLTrans::getString("Female - Excuse me");
- mInventoryItemsDict["Female - Get lost"] = LLTrans::getString("Female - Get lost"); // double space after Female. EXT-8319
- 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 - Hey baby"] = LLTrans::getString("Female - Hey baby");
- mInventoryItemsDict["Female - Laugh"] = LLTrans::getString("Female - Laugh");
- mInventoryItemsDict["Female - Looking good"] = LLTrans::getString("Female - Looking good");
- mInventoryItemsDict["Female - Over here"] = LLTrans::getString("Female - Over here");
- mInventoryItemsDict["Female - Please"] = LLTrans::getString("Female - Please");
- 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");
-
- //common
- mInventoryItemsDict["/bow"] = LLTrans::getString("/bow");
- mInventoryItemsDict["/clap"] = LLTrans::getString("/clap");
- mInventoryItemsDict["/count"] = LLTrans::getString("/count");
- mInventoryItemsDict["/extinguish"] = LLTrans::getString("/extinguish");
- mInventoryItemsDict["/kmb"] = LLTrans::getString("/kmb");
- mInventoryItemsDict["/muscle"] = LLTrans::getString("/muscle");
- mInventoryItemsDict["/no"] = LLTrans::getString("/no");
- mInventoryItemsDict["/no!"] = LLTrans::getString("/no!");
- mInventoryItemsDict["/paper"] = LLTrans::getString("/paper");
- mInventoryItemsDict["/pointme"] = LLTrans::getString("/pointme");
- mInventoryItemsDict["/pointyou"] = LLTrans::getString("/pointyou");
- mInventoryItemsDict["/rock"] = LLTrans::getString("/rock");
- mInventoryItemsDict["/scissor"] = LLTrans::getString("/scissor");
- mInventoryItemsDict["/smoke"] = LLTrans::getString("/smoke");
- mInventoryItemsDict["/stretch"] = LLTrans::getString("/stretch");
- mInventoryItemsDict["/whistle"] = LLTrans::getString("/whistle");
- mInventoryItemsDict["/yes"] = LLTrans::getString("/yes");
- mInventoryItemsDict["/yes!"] = LLTrans::getString("/yes!");
- mInventoryItemsDict["afk"] = LLTrans::getString("afk");
- mInventoryItemsDict["dance1"] = LLTrans::getString("dance1");
- mInventoryItemsDict["dance2"] = LLTrans::getString("dance2");
- mInventoryItemsDict["dance3"] = LLTrans::getString("dance3");
- mInventoryItemsDict["dance4"] = LLTrans::getString("dance4");
- mInventoryItemsDict["dance5"] = LLTrans::getString("dance5");
- mInventoryItemsDict["dance6"] = LLTrans::getString("dance6");
- mInventoryItemsDict["dance7"] = LLTrans::getString("dance7");
- mInventoryItemsDict["dance8"] = LLTrans::getString("dance8");
- }
-
/**
* Finds passed name in dictionary and replaces it with found localized value.
*
@@ -217,6 +119,103 @@ public:
}
};
+LLLocalizedInventoryItemsDictionary::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["New Physics"] = LLTrans::getString("New Physics");
+ mInventoryItemsDict["Invalid Wearable"] = LLTrans::getString("Invalid Wearable");
+
+ mInventoryItemsDict["New Gesture"] = LLTrans::getString("New Gesture");
+ mInventoryItemsDict["New Script"] = LLTrans::getString("New Script");
+ mInventoryItemsDict["New Folder"] = LLTrans::getString("New Folder");
+ mInventoryItemsDict["New Note"] = LLTrans::getString("New Note");
+ 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"); // double space after Male. EXT-8319
+ 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 - Chuckle"] = LLTrans::getString("Female - Chuckle");
+ mInventoryItemsDict["Female - Cry"] = LLTrans::getString("Female - Cry");
+ mInventoryItemsDict["Female - Embarrassed"] = LLTrans::getString("Female - Embarrassed");
+ mInventoryItemsDict["Female - Excuse me"] = LLTrans::getString("Female - Excuse me");
+ mInventoryItemsDict["Female - Get lost"] = LLTrans::getString("Female - Get lost"); // double space after Female. EXT-8319
+ 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 - Hey baby"] = LLTrans::getString("Female - Hey baby");
+ mInventoryItemsDict["Female - Laugh"] = LLTrans::getString("Female - Laugh");
+ mInventoryItemsDict["Female - Looking good"] = LLTrans::getString("Female - Looking good");
+ mInventoryItemsDict["Female - Over here"] = LLTrans::getString("Female - Over here");
+ mInventoryItemsDict["Female - Please"] = LLTrans::getString("Female - Please");
+ 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");
+
+ //common
+ mInventoryItemsDict["/bow"] = LLTrans::getString("/bow");
+ mInventoryItemsDict["/clap"] = LLTrans::getString("/clap");
+ mInventoryItemsDict["/count"] = LLTrans::getString("/count");
+ mInventoryItemsDict["/extinguish"] = LLTrans::getString("/extinguish");
+ mInventoryItemsDict["/kmb"] = LLTrans::getString("/kmb");
+ mInventoryItemsDict["/muscle"] = LLTrans::getString("/muscle");
+ mInventoryItemsDict["/no"] = LLTrans::getString("/no");
+ mInventoryItemsDict["/no!"] = LLTrans::getString("/no!");
+ mInventoryItemsDict["/paper"] = LLTrans::getString("/paper");
+ mInventoryItemsDict["/pointme"] = LLTrans::getString("/pointme");
+ mInventoryItemsDict["/pointyou"] = LLTrans::getString("/pointyou");
+ mInventoryItemsDict["/rock"] = LLTrans::getString("/rock");
+ mInventoryItemsDict["/scissor"] = LLTrans::getString("/scissor");
+ mInventoryItemsDict["/smoke"] = LLTrans::getString("/smoke");
+ mInventoryItemsDict["/stretch"] = LLTrans::getString("/stretch");
+ mInventoryItemsDict["/whistle"] = LLTrans::getString("/whistle");
+ mInventoryItemsDict["/yes"] = LLTrans::getString("/yes");
+ mInventoryItemsDict["/yes!"] = LLTrans::getString("/yes!");
+ mInventoryItemsDict["afk"] = LLTrans::getString("afk");
+ mInventoryItemsDict["dance1"] = LLTrans::getString("dance1");
+ mInventoryItemsDict["dance2"] = LLTrans::getString("dance2");
+ mInventoryItemsDict["dance3"] = LLTrans::getString("dance3");
+ mInventoryItemsDict["dance4"] = LLTrans::getString("dance4");
+ mInventoryItemsDict["dance5"] = LLTrans::getString("dance5");
+ mInventoryItemsDict["dance6"] = LLTrans::getString("dance6");
+ mInventoryItemsDict["dance7"] = LLTrans::getString("dance7");
+ mInventoryItemsDict["dance8"] = LLTrans::getString("dance8");
+}
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
@@ -1303,12 +1302,18 @@ void update_inventory_item(
if (updates.has("asset_id"))
{
updates.erase("asset_id");
- updates["hash_id"] = update_item->getTransactionID();
+ if (update_item->getTransactionID().notNull())
+ {
+ updates["hash_id"] = update_item->getTransactionID();
+ }
}
if (updates.has("shadow_id"))
{
updates.erase("shadow_id");
- updates["hash_id"] = update_item->getTransactionID();
+ if (update_item->getTransactionID().notNull())
+ {
+ updates["hash_id"] = update_item->getTransactionID();
+ }
}
AISAPI::completion_t cr = boost::bind(&doInventoryCb, cb, _1);
AISAPI::UpdateItem(item_id, updates, cr);
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index 5194679a0c..074d51b8b3 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -30,7 +30,7 @@
#include "llinventory.h"
#include "llframetimer.h"
#include "llwearable.h"
-#include "llui.h" //for LLDestroyClass
+#include "llinitdestroyclass.h" //for LLDestroyClass
#include <boost/signals2.hpp> // boost::signals2::trackable
diff --git a/indra/newview/llviewerjoystick.h b/indra/newview/llviewerjoystick.h
index 80c758a5af..016b435ee8 100644
--- a/indra/newview/llviewerjoystick.h
+++ b/indra/newview/llviewerjoystick.h
@@ -45,10 +45,10 @@ typedef enum e_joystick_driver_state
class LLViewerJoystick : public LLSingleton<LLViewerJoystick>
{
-public:
- LLViewerJoystick();
+ LLSINGLETON(LLViewerJoystick);
virtual ~LLViewerJoystick();
-
+
+public:
void init(bool autoenable);
void terminate();
diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp
index 2186ed3c52..fd4315a319 100644
--- a/indra/newview/llviewerkeyboard.cpp
+++ b/indra/newview/llviewerkeyboard.cpp
@@ -57,6 +57,7 @@ const F32 ORBIT_NUDGE_RATE = 0.05f; // fraction of normal speed
struct LLKeyboardActionRegistry
: public LLRegistrySingleton<std::string, boost::function<void (EKeystate keystate)>, LLKeyboardActionRegistry>
{
+ LLSINGLETON_EMPTY_CTOR(LLKeyboardActionRegistry);
};
LLViewerKeyboard gViewerKeyboard;
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 78c4d98d55..9f05ee61bd 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -167,6 +167,7 @@ static bool sForceUpdate = false;
static LLUUID sOnlyAudibleTextureID = LLUUID::null;
static F64 sLowestLoadableImplInterest = 0.0f;
static bool sAnyMediaShowing = false;
+static bool sAnyMediaPlaying = false;
static boost::signals2::connection sTeleportFinishConnection;
static std::string sUpdatedCookies;
static const char *PLUGIN_COOKIE_FILE_NAME = "plugin_cookies.txt";
@@ -606,6 +607,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
createSpareBrowserMediaSource();
sAnyMediaShowing = false;
+ sAnyMediaPlaying = false;
sUpdatedCookies = getCookieStore()->getChangedCookies();
if(!sUpdatedCookies.empty())
{
@@ -808,6 +810,12 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
sAnyMediaShowing = true;
}
+ if (!pimpl->getUsedInUI() && pimpl->hasMedia() && (pimpl->isMediaPlaying() || !pimpl->isMediaTimeBased()))
+ {
+ // consider visible non-timebased media as playing
+ sAnyMediaPlaying = true;
+ }
+
}
}
@@ -858,6 +866,13 @@ bool LLViewerMedia::isAnyMediaShowing()
//////////////////////////////////////////////////////////////////////////////////////////
// static
+bool LLViewerMedia::isAnyMediaPlaying()
+{
+ return sAnyMediaPlaying;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
void LLViewerMedia::setAllMediaEnabled(bool val)
{
// Set "tentative" autoplay first. We need to do this here or else
@@ -913,6 +928,77 @@ void LLViewerMedia::setAllMediaEnabled(bool val)
//////////////////////////////////////////////////////////////////////////////////////////
// static
+void LLViewerMedia::setAllMediaPaused(bool val)
+{
+ // Set "tentative" autoplay first. We need to do this here or else
+ // re-enabling won't start up the media below.
+ gSavedSettings.setBOOL("MediaTentativeAutoPlay", !val);
+
+ // Then
+ impl_list::iterator iter = sViewerMediaImplList.begin();
+ impl_list::iterator end = sViewerMediaImplList.end();
+
+ for (; iter != end; iter++)
+ {
+ LLViewerMediaImpl* pimpl = *iter;
+ if (!pimpl->getUsedInUI())
+ {
+ // upause/pause time based media, enable/disable any other
+ if (!val)
+ {
+ pimpl->setDisabled(val);
+ if (pimpl->isMediaTimeBased() && pimpl->isMediaPaused())
+ {
+ pimpl->play();
+ }
+ }
+ else if (pimpl->isMediaTimeBased() && pimpl->mMediaSource && (pimpl->isMediaPlaying() || pimpl->isMediaPaused()))
+ {
+ pimpl->pause();
+ }
+ else
+ {
+ pimpl->setDisabled(val);
+ }
+ }
+ }
+
+ // Also do Parcel Media and Parcel Audio
+ if (!val)
+ {
+ if (!LLViewerMedia::isParcelMediaPlaying() && LLViewerMedia::hasParcelMedia())
+ {
+ LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel());
+ }
+
+ if (gSavedSettings.getBOOL("AudioStreamingMusic") &&
+ !LLViewerMedia::isParcelAudioPlaying() &&
+ gAudiop &&
+ LLViewerMedia::hasParcelAudio())
+ {
+ if (LLAudioEngine::AUDIO_PAUSED == gAudiop->isInternetStreamPlaying())
+ {
+ // 'false' means unpause
+ gAudiop->pauseInternetStream(false);
+ }
+ else
+ {
+ LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLViewerMedia::getParcelAudioURL());
+ }
+ }
+ }
+ else {
+ // This actually unloads the impl, as opposed to "stop"ping the media
+ LLViewerParcelMedia::stop();
+ if (gAudiop)
+ {
+ LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();
+ }
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
bool LLViewerMedia::isParcelMediaPlaying()
{
return (LLViewerMedia::hasParcelMedia() && LLViewerParcelMedia::getParcelMedia() && LLViewerParcelMedia::getParcelMedia()->hasMedia());
@@ -1820,7 +1906,9 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
}
else if(LLFile::stat(plugin_name, &s))
{
+#if !LL_LINUX
LL_WARNS_ONCE("Media") << "Couldn't find plugin at " << plugin_name << LL_ENDL;
+#endif
}
else
{
@@ -1862,8 +1950,10 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
}
}
}
-
+#if !LL_LINUX
LL_WARNS_ONCE("Plugin") << "plugin initialization failed for mime type: " << media_type << LL_ENDL;
+#endif
+
if(gAgent.isInitialized())
{
if (std::find(sMimeTypesFailed.begin(), sMimeTypesFailed.end(), media_type) == sMimeTypesFailed.end())
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 1fecf15fc9..0212bf88bf 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -105,9 +105,13 @@ public:
// Is any media currently "showing"? Includes Parcel Media. Does not include media in the UI.
static bool isAnyMediaShowing();
+ // Shows if any media is playing, counts visible non time based media as playing. Does not include media in the UI.
+ static bool isAnyMediaPlaying();
// Set all media enabled or disabled, depending on val. Does not include media in the UI.
static void setAllMediaEnabled(bool val);
-
+ // Set all media paused(stopped for non time based) or playing, depending on val. Does not include media in the UI.
+ static void setAllMediaPaused(bool val);
+
static void updateMedia(void* dummy_arg = NULL);
static void initClass();
diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h
index 0b2a64868e..368c671f84 100644
--- a/indra/newview/llviewermediafocus.h
+++ b/indra/newview/llviewermediafocus.h
@@ -41,10 +41,10 @@ class LLViewerMediaFocus :
public LLFocusableElement,
public LLSingleton<LLViewerMediaFocus>
{
-public:
- LLViewerMediaFocus();
+ LLSINGLETON(LLViewerMediaFocus);
~LLViewerMediaFocus();
-
+
+public:
// Set/clear the face that has media focus (takes keyboard input and has the full set of controls)
void setFocusFace(LLPointer<LLViewerObject> objectp, S32 face, viewer_media_t media_impl, LLVector3 pick_normal = LLVector3::zero);
void clearFocus();
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 72579d4d7a..99b7a98abc 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -62,7 +62,6 @@
#include "llfloaterbuycontents.h"
#include "llbuycurrencyhtml.h"
#include "llfloatergodtools.h"
-#include "llfloaterinventory.h"
#include "llfloaterimcontainer.h"
#include "llfloaterland.h"
#include "llfloaterimnearbychat.h"
@@ -80,6 +79,7 @@
#include "lllandmarkactions.h"
#include "llgroupmgr.h"
#include "lltooltip.h"
+#include "lltoolface.h"
#include "llhints.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
@@ -89,6 +89,7 @@
#include "llinventoryfunctions.h"
#include "llpanellogin.h"
#include "llpanelblockedlist.h"
+#include "llpanelmaininventory.h"
#include "llmarketplacefunctions.h"
#include "llmenuoptionpathfindingrebakenavmesh.h"
#include "llmoveview.h"
@@ -133,6 +134,7 @@
#include "llpathfindingmanager.h"
#include "llstartup.h"
#include "boost/unordered_map.hpp"
+#include "llcleanup.h"
using namespace LLAvatarAppearanceDefines;
@@ -1211,14 +1213,15 @@ class LLAdvancedToggleWireframe : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
gUseWireframe = !(gUseWireframe);
+ gWindowResized = TRUE;
+
+ LLPipeline::updateRenderDeferred();
if (gUseWireframe)
{
gInitialDeferredModeForWireframe = LLPipeline::sRenderDeferred;
}
- gWindowResized = TRUE;
- LLPipeline::updateRenderDeferred();
gPipeline.resetVertexBuffers();
if (!gUseWireframe && !gInitialDeferredModeForWireframe && LLPipeline::sRenderDeferred != gInitialDeferredModeForWireframe && gPipeline.isInit())
@@ -5183,30 +5186,91 @@ class LLToolsEnableSelectNextPart : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- bool new_value = (gSavedSettings.getBOOL("EditLinkedParts") &&
- !LLSelectMgr::getInstance()->getSelection()->isEmpty());
+ bool new_value = (!LLSelectMgr::getInstance()->getSelection()->isEmpty()
+ && (gSavedSettings.getBOOL("EditLinkedParts")
+ || LLToolFace::getInstance() == LLToolMgr::getInstance()->getCurrentTool()));
return new_value;
}
};
-// Cycle selection through linked children in selected object.
+// Cycle selection through linked children or/and faces in selected object.
// FIXME: Order of children list is not always the same as sim's idea of link order. This may confuse
// resis. Need link position added to sim messages to address this.
-class LLToolsSelectNextPart : public view_listener_t
+class LLToolsSelectNextPartFace : public view_listener_t
{
- bool handleEvent(const LLSD& userdata)
- {
+ bool handleEvent(const LLSD& userdata)
+ {
+ bool cycle_faces = LLToolFace::getInstance() == LLToolMgr::getInstance()->getCurrentTool();
+ bool cycle_linked = gSavedSettings.getBOOL("EditLinkedParts");
+
+ if (!cycle_faces && !cycle_linked)
+ {
+ // Nothing to do
+ return true;
+ }
+
+ bool fwd = (userdata.asString() == "next");
+ bool prev = (userdata.asString() == "previous");
+ bool ifwd = (userdata.asString() == "includenext");
+ bool iprev = (userdata.asString() == "includeprevious");
+
+ LLViewerObject* to_select = NULL;
+ bool restart_face_on_part = !cycle_faces;
+ S32 new_te = 0;
+
+ if (cycle_faces)
+ {
+ // Cycle through faces of current selection, if end is reached, swithc to next part (if present)
+ LLSelectNode* nodep = LLSelectMgr::getInstance()->getSelection()->getFirstNode();
+ if (!nodep) return false;
+ to_select = nodep->getObject();
+ if (!to_select) return false;
+
+ S32 te_count = to_select->getNumTEs();
+ S32 selected_te = nodep->getLastOperatedTE();
+
+ if (fwd || ifwd)
+ {
+ if (selected_te < 0)
+ {
+ new_te = 0;
+ }
+ else if (selected_te + 1 < te_count)
+ {
+ // select next face
+ new_te = selected_te + 1;
+ }
+ else
+ {
+ // restart from first face on next part
+ restart_face_on_part = true;
+ }
+ }
+ else if (prev || iprev)
+ {
+ if (selected_te > te_count)
+ {
+ new_te = te_count - 1;
+ }
+ else if (selected_te - 1 >= 0)
+ {
+ // select previous face
+ new_te = selected_te - 1;
+ }
+ else
+ {
+ // restart from last face on next part
+ restart_face_on_part = true;
+ }
+ }
+ }
+
S32 object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
- if (gSavedSettings.getBOOL("EditLinkedParts") && object_count)
+ if (cycle_linked && object_count && restart_face_on_part)
{
LLViewerObject* selected = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
if (selected && selected->getRootEdit())
{
- bool fwd = (userdata.asString() == "next");
- bool prev = (userdata.asString() == "previous");
- bool ifwd = (userdata.asString() == "includenext");
- bool iprev = (userdata.asString() == "includeprevious");
- LLViewerObject* to_select = NULL;
LLViewerObject::child_list_t children = selected->getRootEdit()->getChildren();
children.push_front(selected->getRootEdit()); // need root in the list too
@@ -5248,22 +5312,40 @@ class LLToolsSelectNextPart : public view_listener_t
}
}
}
-
- if (to_select)
- {
- if (gFocusMgr.childHasKeyboardFocus(gFloaterTools))
- {
- gFocusMgr.setKeyboardFocus(NULL); // force edit toolbox to commit any changes
- }
- if (fwd || prev)
- {
- LLSelectMgr::getInstance()->deselectAll();
- }
- LLSelectMgr::getInstance()->selectObjectOnly(to_select);
- return true;
- }
}
}
+
+ if (to_select)
+ {
+ if (gFocusMgr.childHasKeyboardFocus(gFloaterTools))
+ {
+ gFocusMgr.setKeyboardFocus(NULL); // force edit toolbox to commit any changes
+ }
+ if (fwd || prev)
+ {
+ LLSelectMgr::getInstance()->deselectAll();
+ }
+ if (cycle_faces)
+ {
+ if (restart_face_on_part)
+ {
+ if (fwd || ifwd)
+ {
+ new_te = 0;
+ }
+ else
+ {
+ new_te = to_select->getNumTEs() - 1;
+ }
+ }
+ LLSelectMgr::getInstance()->addAsIndividual(to_select, new_te, FALSE);
+ }
+ else
+ {
+ LLSelectMgr::getInstance()->selectObjectOnly(to_select);
+ }
+ return true;
+ }
return true;
}
};
@@ -8509,7 +8591,7 @@ class LLWorldPostProcess : public view_listener_t
void handle_flush_name_caches()
{
- LLAvatarNameCache::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLAvatarNameCache);
if (gCacheName) gCacheName->clear();
}
@@ -8553,7 +8635,7 @@ class LLToggleUIHints : public view_listener_t
void LLUploadCostCalculator::calculateCost()
{
- S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ S32 upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload();
// getPriceUpload() returns -1 if no data available yet.
if(upload_cost >= 0)
@@ -8770,7 +8852,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLToolsEditLinkedParts(), "Tools.EditLinkedParts");
view_listener_t::addMenu(new LLToolsSnapObjectXY(), "Tools.SnapObjectXY");
view_listener_t::addMenu(new LLToolsUseSelectionForGrid(), "Tools.UseSelectionForGrid");
- view_listener_t::addMenu(new LLToolsSelectNextPart(), "Tools.SelectNextPart");
+ view_listener_t::addMenu(new LLToolsSelectNextPartFace(), "Tools.SelectNextPart");
commit.add("Tools.Link", boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance()));
commit.add("Tools.Unlink", boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance()));
view_listener_t::addMenu(new LLToolsStopAllAnimations(), "Tools.StopAllAnimations");
@@ -9097,7 +9179,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLGoToObject(), "GoToObject");
commit.add("PayObject", boost::bind(&handle_give_money_dialog));
- commit.add("Inventory.NewWindow", boost::bind(&LLFloaterInventory::showAgentInventory));
+ commit.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow));
enable.add("EnablePayObject", boost::bind(&enable_pay_object));
enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar));
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index b48b45502b..d46bb0199b 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -84,7 +84,7 @@ class LLFileEnableUpload : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
return true;
-// bool new_value = gStatusBar && LLGlobalEconomy::Singleton::getInstance() && (gStatusBar->getBalance() >= LLGlobalEconomy::Singleton::getInstance()->getPriceUpload());
+// bool new_value = gStatusBar && LLGlobalEconomy::getInstance() && (gStatusBar->getBalance() >= LLGlobalEconomy::getInstance()->getPriceUpload());
// return new_value;
}
};
@@ -93,6 +93,12 @@ class LLFileEnableUploadModel : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
+ LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) LLFloaterReg::findInstance("upload_model");
+ if (fmp && fmp->isModelLoading())
+ {
+ return false;
+ }
+
return true;
}
};
@@ -359,7 +365,7 @@ class LLFileUploadModel : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) LLFloaterReg::getInstance("upload_model");
- if (fmp)
+ if (fmp && !fmp->isModelLoading())
{
fmp->loadModel(3);
}
@@ -423,7 +429,7 @@ class LLFileUploadBulk : public view_listener_t
if (picker.getMultipleOpenFiles())
{
std::string filename = picker.getFirstFile();
- S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ S32 expected_upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload();
while (!filename.empty())
{
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index f472db080f..d81cb804e4 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -5467,9 +5467,12 @@ static std::string reason_from_transaction_type(S32 transaction_type,
case TRANS_CLASSIFIED_CHARGE:
return LLTrans::getString("to publish a classified ad");
+ case TRANS_GIFT:
+ // Simulator returns "Payment" if no custom description has been entered
+ return (item_desc == "Payment" ? std::string() : item_desc);
+
// These have no reason to display, but are expected and should not
// generate warnings
- case TRANS_GIFT:
case TRANS_PAY_OBJECT:
case TRANS_OBJECT_PAYS:
return std::string();
@@ -5579,6 +5582,7 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
LLSD payload;
bool you_paid_someone = (source_id == gAgentID);
+ std::string gift_suffix = (transaction_type == TRANS_GIFT ? "_gift" : "");
if (you_paid_someone)
{
if(!gSavedSettings.getBOOL("NotifyMoneySpend"))
@@ -5592,8 +5596,8 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
{
if (dest_id.notNull())
{
- message = success ? LLTrans::getString("you_paid_ldollars", args) :
- LLTrans::getString("you_paid_failure_ldollars", args);
+ message = success ? LLTrans::getString("you_paid_ldollars" + gift_suffix, args) :
+ LLTrans::getString("you_paid_failure_ldollars" + gift_suffix, args);
}
else
{
@@ -5620,7 +5624,8 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
payload["dest_id"] = dest_id;
notification = success ? "PaymentSent" : "PaymentFailure";
}
- else {
+ else
+ {
// ...someone paid you
if(!gSavedSettings.getBOOL("NotifyMoneyReceived"))
{
@@ -5631,9 +5636,10 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
name_id = source_id;
if (!reason.empty())
{
- message = LLTrans::getString("paid_you_ldollars", args);
+ message = LLTrans::getString("paid_you_ldollars" + gift_suffix, args);
}
- else {
+ else
+ {
message = LLTrans::getString("paid_you_ldollars_no_reason", args);
}
final_args["MESSAGE"] = message;
@@ -6278,9 +6284,9 @@ void process_frozen_message(LLMessageSystem *msgsystem, void **user_data)
// do some extra stuff once we get our economy data
void process_economy_data(LLMessageSystem *msg, void** /*user_data*/)
{
- LLGlobalEconomy::processEconomyData(msg, LLGlobalEconomy::Singleton::getInstance());
+ LLGlobalEconomy::processEconomyData(msg, LLGlobalEconomy::getInstance());
- S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ S32 upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload();
LL_INFOS_ONCE("Messaging") << "EconomyData message arrived; upload cost is L$" << upload_cost << LL_ENDL;
@@ -6385,6 +6391,16 @@ bool unknown_script_question_cb(const LLSD& notification, const LLSD& response)
return false;
}
+void experiencePermissionBlock(LLUUID experience, LLSD result)
+{
+ LLSD permission;
+ LLSD data;
+ permission["permission"] = "Block";
+ data[experience.asString()] = permission;
+ data["experience"] = experience;
+ LLEventPumps::instance().obtain("experience_permission").post(data);
+}
+
bool script_question_cb(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -6461,14 +6477,8 @@ bool script_question_cb(const LLSD& notification, const LLSD& response)
if (!region)
return false;
- LLExperienceCache::instance().setExperiencePermission(experience, std::string("Block"), LLExperienceCache::ExperienceGetFn_t());
+ LLExperienceCache::instance().setExperiencePermission(experience, std::string("Block"), boost::bind(&experiencePermissionBlock, experience, _1));
- LLSD permission;
- LLSD data;
- permission["permission"] = "Block";
- data[experience.asString()] = permission;
- data["experience"] = experience;
- LLEventPumps::instance().obtain("experience_permission").post(data);
}
}
return false;
diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h
index d8f5c71f8d..b0eaa37541 100644
--- a/indra/newview/llviewermessage.h
+++ b/indra/newview/llviewermessage.h
@@ -210,6 +210,7 @@ void set_dad_inbox_object(const LLUUID& object_id);
class LLViewerMessage : public LLSingleton<LLViewerMessage>
{
+ LLSINGLETON_EMPTY_CTOR(LLViewerMessage);
public:
typedef boost::function<void()> teleport_started_callback_t;
typedef boost::signals2::signal<void()> teleport_started_signal_t;
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index 2525886222..6937d064f9 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -95,13 +95,6 @@ LLGridManager::LLGridManager()
}
-LLGridManager::LLGridManager(const std::string& grid_file)
-{
- // initialize with an explicity grid file for testing.
- LL_DEBUGS("GridManager")<<LL_ENDL;
- initialize(grid_file);
-}
-
//
// LLGridManager - class for managing the list of known grids, and the current
// selection
diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h
index 228303d8e2..b8ff494b8b 100644
--- a/indra/newview/llviewernetwork.h
+++ b/indra/newview/llviewernetwork.h
@@ -58,16 +58,15 @@ protected:
**/
class LLGridManager : public LLSingleton<LLGridManager>
{
+ /// Instantiate the grid manager, load default grids, selects the default grid
+ LLSINGLETON(LLGridManager);
+ ~LLGridManager();
+
public:
/* ================================================================
* @name Initialization and Configuration
* @{
*/
- /// Instantiate the grid manager, load default grids, selects the default grid
- LLGridManager(const std::string& grid_file);
- LLGridManager();
- ~LLGridManager();
-
/// add grids from an external grids file
void initialize(const std::string& grid_file);
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 4da26404e5..45dbd95bea 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -102,6 +102,7 @@
#include "llmediaentry.h"
#include "llfloaterperms.h"
#include "llvocache.h"
+#include "llcleanup.h"
//#define DEBUG_UPDATE_TYPE
@@ -530,11 +531,11 @@ void LLViewerObject::initVOClasses()
void LLViewerObject::cleanupVOClasses()
{
- LLVOGrass::cleanupClass();
- LLVOWater::cleanupClass();
- LLVOTree::cleanupClass();
- LLVOAvatar::cleanupClass();
- LLVOVolume::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLVOGrass);
+ SUBSYSTEM_CLEANUP(LLVOWater);
+ SUBSYSTEM_CLEANUP(LLVOTree);
+ SUBSYSTEM_CLEANUP(LLVOAvatar);
+ SUBSYSTEM_CLEANUP(LLVOVolume);
sObjectDataMap.clear();
}
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index dddfb6745e..2a126c9f01 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -706,7 +706,7 @@ bool LLViewerParcelMgr::allowAgentScripts(const LLViewerRegion* region, const LL
bool LLViewerParcelMgr::allowAgentDamage(const LLViewerRegion* region, const LLParcel* parcel) const
{
return (region && region->getAllowDamage())
- && (parcel && parcel->getAllowDamage());
+ || (parcel && parcel->getAllowDamage());
}
BOOL LLViewerParcelMgr::isOwnedAt(const LLVector3d& pos_global) const
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index bb6bbf3308..29219843c9 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -75,6 +75,8 @@ public:
class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr>
{
+ LLSINGLETON(LLViewerParcelMgr);
+ ~LLViewerParcelMgr();
public:
typedef boost::function<void (const LLVector3d&, const bool& local)> teleport_finished_callback_t;
@@ -82,9 +84,6 @@ public:
typedef boost::function<void()> teleport_failed_callback_t;
typedef boost::signals2::signal<void()> teleport_failed_signal_t;
- LLViewerParcelMgr();
- ~LLViewerParcelMgr();
-
static void cleanupGlobals();
BOOL selectionEmpty() const;
diff --git a/indra/newview/llviewerpartsim.h b/indra/newview/llviewerpartsim.h
index 40e8e1d45d..ab1cd715ab 100644
--- a/indra/newview/llviewerpartsim.h
+++ b/indra/newview/llviewerpartsim.h
@@ -135,9 +135,8 @@ protected:
class LLViewerPartSim : public LLSingleton<LLViewerPartSim>
{
+ LLSINGLETON(LLViewerPartSim);
public:
- LLViewerPartSim();
- virtual ~LLViewerPartSim(){}
void destroyClass();
typedef std::vector<LLViewerPartGroup *> group_list_t;
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index 7843652589..97a060d95e 100644
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -246,13 +246,11 @@ extern LLTrace::EventStatHandle<LLUnit<F32, LLUnits::Percent> > OBJECT_CACHE_HIT
class LLViewerStats : public LLSingleton<LLViewerStats>
{
-public:
- void resetStats();
+ LLSINGLETON(LLViewerStats);
+ ~LLViewerStats();
public:
-
- LLViewerStats();
- ~LLViewerStats();
+ void resetStats();
void updateFrameStats(const F64Seconds time_diff);
diff --git a/indra/newview/llviewerstatsrecorder.h b/indra/newview/llviewerstatsrecorder.h
index d1744f4910..c974bea49d 100644
--- a/indra/newview/llviewerstatsrecorder.h
+++ b/indra/newview/llviewerstatsrecorder.h
@@ -44,11 +44,11 @@ class LLViewerObject;
class LLViewerStatsRecorder : public LLSingleton<LLViewerStatsRecorder>
{
- public:
- LOG_CLASS(LLViewerStatsRecorder);
- LLViewerStatsRecorder();
+ LLSINGLETON(LLViewerStatsRecorder);
+ LOG_CLASS(LLViewerStatsRecorder);
~LLViewerStatsRecorder();
+ public:
void objectUpdateFailure(U32 local_id, const EObjectUpdateType update_type, S32 msg_size)
{
#if LL_RECORD_VIEWER_STATS
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 09cdfe1309..9e09971ced 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -191,7 +191,7 @@ public:
return false;
}
- /*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const
+ /*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const
{
// always draw at beginning of line
if (line_offset == 0)
@@ -1105,10 +1105,6 @@ BOOL LLViewerTextEditor::openEmbeddedItem(LLPointer<LLInventoryItem> item, llwch
openEmbeddedSound( item, wc );
return TRUE;
- case LLAssetType::AT_NOTECARD:
- openEmbeddedNotecard( item, wc );
- return TRUE;
-
case LLAssetType::AT_LANDMARK:
openEmbeddedLandmark( item, wc );
return TRUE;
@@ -1117,6 +1113,7 @@ BOOL LLViewerTextEditor::openEmbeddedItem(LLPointer<LLInventoryItem> item, llwch
openEmbeddedCallingcard( item, wc );
return TRUE;
+ case LLAssetType::AT_NOTECARD:
case LLAssetType::AT_LSL_TEXT:
case LLAssetType::AT_CLOTHING:
case LLAssetType::AT_OBJECT:
@@ -1182,11 +1179,6 @@ void LLViewerTextEditor::openEmbeddedLandmark( LLPointer<LLInventoryItem> item_p
}
}
-void LLViewerTextEditor::openEmbeddedNotecard( LLInventoryItem* item, llwchar wc )
-{
- copyInventory(item, gInventoryCallbacks.registerCB(mInventoryCallback));
-}
-
void LLViewerTextEditor::openEmbeddedCallingcard( LLInventoryItem* item, llwchar wc )
{
if(item && !item->getCreatorUUID().isNull())
diff --git a/indra/newview/llviewertexteditor.h b/indra/newview/llviewertexteditor.h
index 477119d4f2..33cfca4f90 100644
--- a/indra/newview/llviewertexteditor.h
+++ b/indra/newview/llviewertexteditor.h
@@ -105,7 +105,6 @@ private:
void openEmbeddedTexture( LLInventoryItem* item, llwchar wc );
void openEmbeddedSound( LLInventoryItem* item, llwchar wc );
void openEmbeddedLandmark( LLPointer<LLInventoryItem> item_ptr, llwchar wc );
- void openEmbeddedNotecard( LLInventoryItem* item, llwchar wc);
void openEmbeddedCallingcard( LLInventoryItem* item, llwchar wc);
void showCopyToInvDialog( LLInventoryItem* item, llwchar wc );
void showUnsavedAlertDialog( LLInventoryItem* item );
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 178aa1e646..3cef34445a 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1419,11 +1419,17 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)
destroyRawImage();
return FALSE;
}
- mNeedsCreateTexture = FALSE;
+ mNeedsCreateTexture = FALSE;
if (mRawImage.isNull())
{
LL_ERRS() << "LLViewerTexture trying to create texture with no Raw Image" << LL_ENDL;
}
+ if (mRawImage->isBufferInvalid())
+ {
+ LL_WARNS() << "Can't create a texture: invalid image data" << LL_ENDL;
+ destroyRawImage();
+ return FALSE;
+ }
// LL_INFOS() << llformat("IMAGE Creating (%d) [%d x %d] Bytes: %d ",
// mRawDiscardLevel,
// mRawImage->getWidth(), mRawImage->getHeight(),mRawImage->getDataSize())
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index ba76770838..070544063a 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -237,6 +237,7 @@ private:
class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIImageList>
{
+ LLSINGLETON_EMPTY_CTOR(LLUIImageList);
public:
// LLImageProviderInterface
/*virtual*/ LLPointer<LLUIImage> getUIImageByID(const LLUUID& id, S32 priority);
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 9e68bb78e0..61505b7c07 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -208,6 +208,7 @@
#include "llwindowlistener.h"
#include "llviewerwindowlistener.h"
#include "llpaneltopinfobar.h"
+#include "llcleanup.h"
#if LL_WINDOWS
#include <tchar.h> // For Unicode conversion methods
@@ -292,13 +293,8 @@ public:
class RecordToChatConsole : public LLSingleton<RecordToChatConsole>
{
+ LLSINGLETON(RecordToChatConsole);
public:
- RecordToChatConsole()
- : LLSingleton<RecordToChatConsole>(),
- mRecorder(new RecordToChatConsoleRecorder())
- {
- }
-
void startRecorder() { LLError::addRecorder(mRecorder); }
void stopRecorder() { LLError::removeRecorder(mRecorder); }
@@ -306,6 +302,11 @@ private:
LLError::RecorderPtr mRecorder;
};
+RecordToChatConsole::RecordToChatConsole():
+ mRecorder(new RecordToChatConsoleRecorder())
+{
+}
+
////////////////////////////////////////////////////////////////////////////
//
// LLDebugText
@@ -1598,17 +1599,20 @@ BOOL LLViewerWindow::handleDeviceChange(LLWindow *window)
return FALSE;
}
-void LLViewerWindow::handleDPIChanged(LLWindow *window, F32 ui_scale_factor, S32 window_width, S32 window_height)
+BOOL LLViewerWindow::handleDPIChanged(LLWindow *window, F32 ui_scale_factor, S32 window_width, S32 window_height)
{
if (ui_scale_factor >= MIN_UI_SCALE && ui_scale_factor <= MAX_UI_SCALE)
{
+ gSavedSettings.setF32("LastSystemUIScaleFactor", ui_scale_factor);
gSavedSettings.setF32("UIScaleFactor", ui_scale_factor);
LLViewerWindow::reshape(window_width, window_height);
mResDirty = true;
+ return TRUE;
}
else
{
LL_WARNS() << "DPI change caused UI scale to go out of bounds: " << ui_scale_factor << LL_ENDL;
+ return FALSE;
}
}
@@ -2176,10 +2180,7 @@ void LLViewerWindow::shutdownViews()
// destroy the nav bar, not currently part of gViewerWindow
// *TODO: Make LLNavigationBar part of gViewerWindow
- if (LLNavigationBar::instanceExists())
- {
- delete LLNavigationBar::getInstance();
- }
+ LLNavigationBar::deleteSingleton();
LL_INFOS() << "LLNavigationBar destroyed." << LL_ENDL ;
// destroy menus after instantiating navbar above, as it needs
@@ -2215,7 +2216,7 @@ void LLViewerWindow::shutdownGL()
// Shutdown GL cleanly. Order is very important here.
//--------------------------------------------------------
LLFontGL::destroyDefaultFonts();
- LLFontManager::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLFontManager);
stop_glerror();
gSky.cleanup();
@@ -2238,7 +2239,7 @@ void LLViewerWindow::shutdownGL()
LLWorldMapView::cleanupTextures();
LLViewerTextureManager::cleanup() ;
- LLImageGL::cleanupClass() ;
+ SUBSYSTEM_CLEANUP(LLImageGL) ;
LL_INFOS() << "All textures and llimagegl images are destroyed!" << LL_ENDL ;
@@ -2251,7 +2252,7 @@ void LLViewerWindow::shutdownGL()
gGL.shutdown();
- LLVertexBuffer::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLVertexBuffer);
LL_INFOS() << "LLVertexBuffer cleaned." << LL_ENDL ;
}
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 72b7370621..a134dfaaa9 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -211,7 +211,7 @@ public:
/*virtual*/ void handleDataCopy(LLWindow *window, S32 data_type, void *data);
/*virtual*/ BOOL handleTimerEvent(LLWindow *window);
/*virtual*/ BOOL handleDeviceChange(LLWindow *window);
- /*virtual*/ void handleDPIChanged(LLWindow *window, F32 ui_scale_factor, S32 window_width, S32 window_height);
+ /*virtual*/ BOOL handleDPIChanged(LLWindow *window, F32 ui_scale_factor, S32 window_width, S32 window_height);
/*virtual*/ void handlePingWatchdog(LLWindow *window, const char * msg);
/*virtual*/ void handlePauseWatchdog(LLWindow *window);
diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h
index 082f5f0b1d..7aabde1b2d 100644
--- a/indra/newview/llvocache.h
+++ b/indra/newview/llvocache.h
@@ -223,6 +223,9 @@ private:
//
class LLVOCache : public LLSingleton<LLVOCache>
{
+ LLSINGLETON(LLVOCache);
+ ~LLVOCache() ;
+
private:
struct HeaderEntryInfo
{
@@ -253,13 +256,8 @@ private:
};
typedef std::set<HeaderEntryInfo*, header_entry_less> header_entry_queue_t;
typedef std::map<U64, HeaderEntryInfo*> handle_entry_map_t;
-private:
- friend class LLSingleton<LLVOCache>;
- LLVOCache() ;
public:
- ~LLVOCache() ;
-
void initCache(ELLPath location, U32 size, U32 cache_version) ;
void removeCache(ELLPath location, bool started = false) ;
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index ef15b2c79e..309c3eebdd 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -167,8 +167,8 @@ private:
class LLVoiceChannelProximal : public LLVoiceChannel, public LLSingleton<LLVoiceChannelProximal>
{
+ LLSINGLETON(LLVoiceChannelProximal);
public:
- LLVoiceChannelProximal();
/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
/*virtual*/ void handleStatusChange(EStatusType status);
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index b05bcb23b7..32637dcf42 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -299,11 +299,11 @@ public:
class LLVoiceClient: public LLSingleton<LLVoiceClient>
{
+ LLSINGLETON(LLVoiceClient);
LOG_CLASS(LLVoiceClient);
-public:
- LLVoiceClient();
~LLVoiceClient();
+public:
typedef boost::signals2::signal<void(void)> micro_changed_signal_t;
micro_changed_signal_t mMicroChangedSignal;
@@ -485,6 +485,8 @@ protected:
**/
class LLSpeakerVolumeStorage : public LLSingleton<LLSpeakerVolumeStorage>
{
+ LLSINGLETON(LLSpeakerVolumeStorage);
+ ~LLSpeakerVolumeStorage();
LOG_CLASS(LLSpeakerVolumeStorage);
public:
@@ -513,10 +515,6 @@ public:
void removeSpeakerVolume(const LLUUID& speaker_id);
private:
- friend class LLSingleton<LLSpeakerVolumeStorage>;
- LLSpeakerVolumeStorage();
- ~LLSpeakerVolumeStorage();
-
const static std::string SETTINGS_FILE_NAME;
void load();
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index f32c7c975f..81e924e438 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -56,12 +56,11 @@ class LLVivoxVoiceClient : public LLSingleton<LLVivoxVoiceClient>,
virtual public LLVoiceModuleInterface,
virtual public LLVoiceEffectInterface
{
+ LLSINGLETON(LLVivoxVoiceClient);
LOG_CLASS(LLVivoxVoiceClient);
-public:
- LLVivoxVoiceClient();
virtual ~LLVivoxVoiceClient();
-
-
+
+public:
/// @name LLVoiceModuleInterface virtual implementations
/// @see LLVoiceModuleInterface
//@{
@@ -1027,10 +1026,10 @@ protected:
class LLVivoxSecurity : public LLSingleton<LLVivoxSecurity>
{
- public:
- LLVivoxSecurity();
- virtual ~LLVivoxSecurity();
+ LLSINGLETON(LLVivoxSecurity);
+ virtual ~LLVivoxSecurity();
+ public:
std::string connectorHandle() { return mConnectorHandle; };
std::string accountHandle() { return mAccountHandle; };
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 657babd92c..098996147f 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -81,6 +81,8 @@
const F32 FORCE_SIMPLE_RENDER_AREA = 512.f;
const F32 FORCE_CULL_AREA = 8.f;
+const F32 MIN_RENDER_COMPLEXITY = 0.f;
+const F32 MAX_RENDER_COMPLEXITY = 1.0e6f;
U32 JOINT_COUNT_REQUIRED_FOR_FULLRIG = 1;
BOOL gAnimateTextures = TRUE;
@@ -3615,6 +3617,8 @@ U32 LLVOVolume::getRenderCost(texture_cost_t &textures) const
shame += media_faces * ARC_MEDIA_FACE_COST;
}
+ shame = llclamp(shame, MIN_RENDER_COMPLEXITY, MAX_RENDER_COMPLEXITY);
+
if (shame > mRenderComplexity_current)
{
mRenderComplexity_current = (S32)shame;
diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp
index 90bc6509a6..16130b5ca7 100644
--- a/indra/newview/llvowlsky.cpp
+++ b/indra/newview/llvowlsky.cpp
@@ -810,18 +810,18 @@ BOOL LLVOWLSky::updateStarGeometry(LLDrawable *drawable)
up *= sc;
*(verticesp++) = mStarVertices[vtx];
- *(verticesp++) = mStarVertices[vtx]+left;
+ *(verticesp++) = mStarVertices[vtx]+up;
*(verticesp++) = mStarVertices[vtx]+left+up;
- *(verticesp++) = mStarVertices[vtx]+left;
+ *(verticesp++) = mStarVertices[vtx];
*(verticesp++) = mStarVertices[vtx]+left+up;
- *(verticesp++) = mStarVertices[vtx]+up;
+ *(verticesp++) = mStarVertices[vtx]+left;
- *(texcoordsp++) = LLVector2(0,0);
- *(texcoordsp++) = LLVector2(0,1);
+ *(texcoordsp++) = LLVector2(1,0);
*(texcoordsp++) = LLVector2(1,1);
*(texcoordsp++) = LLVector2(0,1);
- *(texcoordsp++) = LLVector2(1,1);
*(texcoordsp++) = LLVector2(1,0);
+ *(texcoordsp++) = LLVector2(0,1);
+ *(texcoordsp++) = LLVector2(0,0);
*(colorsp++) = LLColor4U(mStarColors[vtx]);
*(colorsp++) = LLColor4U(mStarColors[vtx]);
diff --git a/indra/newview/llwatchdog.h b/indra/newview/llwatchdog.h
index fee3ec6f20..9a6624258e 100644
--- a/indra/newview/llwatchdog.h
+++ b/indra/newview/llwatchdog.h
@@ -75,10 +75,10 @@ private:
class LLWatchdogTimerThread; // Defined in the cpp
class LLWatchdog : public LLSingleton<LLWatchdog>
{
-public:
- LLWatchdog();
+ LLSINGLETON(LLWatchdog);
~LLWatchdog();
+public:
// Add an entry to the watchdog.
void add(LLWatchdogEntry* e);
void remove(LLWatchdogEntry* e);
diff --git a/indra/newview/llwaterparammanager.h b/indra/newview/llwaterparammanager.h
index dc7d41be2a..3f169e439a 100644
--- a/indra/newview/llwaterparammanager.h
+++ b/indra/newview/llwaterparammanager.h
@@ -214,6 +214,8 @@ struct WaterExpFloatControl
/// WindLight parameter manager class - what controls all the wind light shaders
class LLWaterParamManager : public LLSingleton<LLWaterParamManager>
{
+ LLSINGLETON(LLWaterParamManager);
+ ~LLWaterParamManager();
LOG_CLASS(LLWaterParamManager);
public:
typedef std::list<std::string> preset_name_list_t;
@@ -317,11 +319,7 @@ public:
F32 mDensitySliderValue;
private:
- friend class LLSingleton<LLWaterParamManager>;
/*virtual*/ void initSingleton();
- LLWaterParamManager();
- ~LLWaterParamManager();
-
void loadAllPresets();
void loadPresetsFromDir(const std::string& dir);
bool loadPreset(const std::string& path);
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index f8981d0c51..ee2270c323 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -653,24 +653,16 @@ LLWearableItemsList::~LLWearableItemsList()
{}
// virtual
-void LLWearableItemsList::addNewItem(LLViewerInventoryItem* item, bool rearrange /*= true*/)
+LLPanel* LLWearableItemsList::createNewItem(LLViewerInventoryItem* item)
{
- if (!item)
- {
- LL_WARNS() << "No inventory item. Couldn't create flat list item." << LL_ENDL;
- llassert(item != NULL);
- }
-
- LLPanelWearableOutfitItem *list_item = LLPanelWearableOutfitItem::create(item, mWornIndicationEnabled);
- if (!list_item)
- return;
+ if (!item)
+ {
+ LL_WARNS() << "No inventory item. Couldn't create flat list item." << LL_ENDL;
+ llassert(item != NULL);
+ return NULL;
+ }
- bool is_item_added = addItem(list_item, item->getUUID(), ADD_BOTTOM, rearrange);
- if (!is_item_added)
- {
- LL_WARNS() << "Couldn't add flat list item." << LL_ENDL;
- llassert(is_item_added);
- }
+ return LLPanelWearableOutfitItem::create(item, mWornIndicationEnabled);
}
void LLWearableItemsList::updateList(const LLUUID& category_id)
diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h
index 18a30f083b..f3182ed163 100644
--- a/indra/newview/llwearableitemslist.h
+++ b/indra/newview/llwearableitemslist.h
@@ -411,8 +411,8 @@ public:
*/
class ContextMenu : public LLListContextMenu, public LLSingleton<ContextMenu>
{
+ LLSINGLETON(ContextMenu);
public:
- ContextMenu();
/*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y);
protected:
@@ -453,7 +453,7 @@ public:
virtual ~LLWearableItemsList();
- /*virtual*/ void addNewItem(LLViewerInventoryItem* item, bool rearrange = true);
+ /*virtual*/ LLPanel* createNewItem(LLViewerInventoryItem* item);
void updateList(const LLUUID& category_id);
diff --git a/indra/newview/llwearablelist.h b/indra/newview/llwearablelist.h
index d6f0fd09a6..782f7751e5 100644
--- a/indra/newview/llwearablelist.h
+++ b/indra/newview/llwearablelist.h
@@ -41,9 +41,9 @@
*/
class LLWearableList : public LLSingleton<LLWearableList>
{
-public:
- LLWearableList() {}
+ LLSINGLETON_EMPTY_CTOR(LLWearableList);
~LLWearableList();
+public:
void cleanup() ;
S32 getLength() const { return mList.size(); }
diff --git a/indra/newview/llwindebug.h b/indra/newview/llwindebug.h
index a3cbf6dc03..90882cf04a 100644
--- a/indra/newview/llwindebug.h
+++ b/indra/newview/llwindebug.h
@@ -34,6 +34,7 @@
class LLWinDebug:
public LLSingleton<LLWinDebug>
{
+ LLSINGLETON_EMPTY_CTOR(LLWinDebug);
public:
static void init();
static void generateMinidump(struct _EXCEPTION_POINTERS *pExceptionInfo = NULL);
diff --git a/indra/newview/llwlanimator.cpp b/indra/newview/llwlanimator.cpp
index 2142885767..c8879e73eb 100644
--- a/indra/newview/llwlanimator.cpp
+++ b/indra/newview/llwlanimator.cpp
@@ -155,17 +155,28 @@ F64 LLWLAnimator::getDayTime()
// we're not solving the non-linear equation that determines sun phase
// we're just linearly interpolating between the major points
- if (phase <= 5.0 / 4.0) {
+
+ if (phase <= 5.0 / 4.0)
+ {
+ // mDayTime from 0.33 to 0.75 (6:00 to 21:00)
mDayTime = (1.0 / 3.0) * phase + (1.0 / 3.0);
}
+ else if (phase > 7.0 / 4.0)
+ {
+ // maximum value for phase is 2
+ // mDayTime from 0.25 to 0.33 (3:00 to 6:00)
+ mDayTime = (1.0 / 3.0) - (1.0 / 3.0) * (2 - phase);
+ }
else
{
+ // phase == 3/2 is where day restarts (24:00)
+ // mDayTime from 0.75 to 0.999 and 0 to 0.25 (21:00 to 03:00)
mDayTime = phase - (1.0 / 2.0);
- }
- if(mDayTime > 1)
- {
- mDayTime--;
+ if(mDayTime > 1)
+ {
+ mDayTime--;
+ }
}
return mDayTime;
diff --git a/indra/newview/llwlparammanager.h b/indra/newview/llwlparammanager.h
index e13aed98ed..a10102edf7 100644
--- a/indra/newview/llwlparammanager.h
+++ b/indra/newview/llwlparammanager.h
@@ -213,6 +213,8 @@ public:
/// WindLight parameter manager class - what controls all the wind light shaders
class LLWLParamManager : public LLSingleton<LLWLParamManager>
{
+ LLSINGLETON(LLWLParamManager);
+ ~LLWLParamManager();
LOG_CLASS(LLWLParamManager);
public:
@@ -375,11 +377,7 @@ private:
static std::string getSysDir();
static std::string getUserDir();
- friend class LLSingleton<LLWLParamManager>;
/*virtual*/ void initSingleton();
- LLWLParamManager();
- ~LLWLParamManager();
-
// list of all the parameters, listed by name
std::map<LLWLParamKey, LLWLParamSet> mParamList;
diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h
index b2d8418064..c9ac241d5a 100644
--- a/indra/newview/llworld.h
+++ b/indra/newview/llworld.h
@@ -61,8 +61,8 @@ class LLVOAvatar;
class LLWorld : public LLSingleton<LLWorld>
{
+ LLSINGLETON(LLWorld);
public:
- LLWorld();
void destroyClass();
LLViewerRegion* addRegion(const U64 &region_handle, const LLHost &host);
diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h
index 1a168e4b4d..5e5caa6a74 100644
--- a/indra/newview/llworldmap.h
+++ b/indra/newview/llworldmap.h
@@ -193,10 +193,10 @@ const S32 MAP_BLOCK_RES = (MAP_MAX_SIZE / MAP_BLOCK_SIZE);
class LLWorldMap : public LLSingleton<LLWorldMap>
{
-public:
- LLWorldMap();
+ LLSINGLETON(LLWorldMap);
~LLWorldMap();
+public:
// Clear all: list of region info, tiles, blocks and items
void reset();
diff --git a/indra/newview/llworldmapmessage.h b/indra/newview/llworldmapmessage.h
index ac1ea1607c..65276df068 100644
--- a/indra/newview/llworldmapmessage.h
+++ b/indra/newview/llworldmapmessage.h
@@ -34,13 +34,13 @@ class LLMessageSystem;
class LLWorldMapMessage : public LLSingleton<LLWorldMapMessage>
{
+ LLSINGLETON(LLWorldMapMessage);
+ ~LLWorldMapMessage();
+
public:
typedef boost::function<void(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)>
url_callback_t;
- LLWorldMapMessage();
- ~LLWorldMapMessage();
-
// Process incoming answers to map stuff requests
static void processMapBlockReply(LLMessageSystem*, void**);
static void processMapItemReply(LLMessageSystem*, void**);
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index c6bbfb1c8f..19487c3230 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -114,6 +114,7 @@
#include "llpathfindingpathtool.h"
#include "llscenemonitor.h"
#include "llprogressview.h"
+#include "llcleanup.h"
#ifdef _DEBUG
// Debug indices is disabled for now for debug performance - djs 4/24/02
@@ -7385,7 +7386,7 @@ void LLPipeline::doResetVertexBuffers(bool forced)
}
LLVOPartGroup::destroyGL();
- LLVertexBuffer::cleanupClass();
+ SUBSYSTEM_CLEANUP(LLVertexBuffer);
//delete all name pool caches
LLGLNamePool::cleanupPools();
@@ -7772,12 +7773,10 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
F32 fov = LLViewerCamera::getInstance()->getView();
const F32 default_fov = CameraFieldOfView * F_PI/180.f;
- //const F32 default_aspect_ratio = gSavedSettings.getF32("CameraAspectRatio");
//F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight();
F32 dv = 2.f*default_focal_length * tanf(default_fov/2.f);
- //F32 dh = 2.f*default_focal_length * tanf(default_fov*default_aspect_ratio/2.f);
F32 focal_length = dv/(2*tanf(fov/2.f));
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index f2da22256c..760c294f90 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -150,6 +150,7 @@ with the same filename but different name
<texture name="Command_Places_Icon" file_name="toolbar_icons/places.png" preload="true" />
<texture name="Command_Preferences_Icon" file_name="toolbar_icons/preferences.png" preload="true" />
<texture name="Command_Profile_Icon" file_name="toolbar_icons/profile.png" preload="true" />
+ <texture name="Command_Report_Abuse_Icon" file_name="toolbar_icons/report_abuse.png" preload="true" />
<texture name="Command_Search_Icon" file_name="toolbar_icons/search.png" preload="true" />
<texture name="Command_Snapshot_Icon" file_name="toolbar_icons/snapshot.png" preload="true" />
<texture name="Command_Speak_Icon" file_name="toolbar_icons/speak.png" preload="true" />
diff --git a/indra/newview/skins/default/textures/toolbar_icons/report_abuse.png b/indra/newview/skins/default/textures/toolbar_icons/report_abuse.png
new file mode 100644
index 0000000000..d5cb6ca259
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/report_abuse.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 8c0b5748de..779b168ae0 100644
--- a/indra/newview/skins/default/xui/da/floater_about.xml
+++ b/indra/newview/skins/default/xui/da/floater_about.xml
@@ -25,6 +25,7 @@ Grafik kort: [GRAPHICS_CARD]
J2C Decoder Version: [J2C_VERSION]
Audio Driver Version: [AUDIO_DRIVER_VERSION]
LLCEFLib/CEF Version: [LLCEFLIB_VERSION]
+LibVLC Version: [LIBVLC_VERSION]
Voice Server Version: [VOICE_VERSION]
</floater.string>
<floater.string name="none">
diff --git a/indra/newview/skins/default/xui/de/floater_model_preview.xml b/indra/newview/skins/default/xui/de/floater_model_preview.xml
index f06e856966..337fee8cb1 100644
--- a/indra/newview/skins/default/xui/de/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_model_preview.xml
@@ -245,6 +245,7 @@
</text>
<check_box label="Skingewicht einschließen" name="upload_skin"/>
<check_box label="Gelenkpositionen einschließen" name="upload_joints"/>
+ <check_box label="Skala sperren, wenn Gelenkposition definiert ist" name="lock_scale_if_joint_position"/>
<text name="pelvis_offset_label">
Z-Offset (Avatar anheben oder senken):
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_pay.xml b/indra/newview/skins/default/xui/de/floater_pay.xml
index 1882f5150b..b9e253a668 100644
--- a/indra/newview/skins/default/xui/de/floater_pay.xml
+++ b/indra/newview/skins/default/xui/de/floater_pay.xml
@@ -1,9 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string name="payee_group">Gruppe bezahlen</string>
- <string name="payee_resident">Einwohner bezahlen</string>
- <text name="paying_text">Sie zahlen:</text>
- <text left="130" name="payee_name">Extrem langen Namen testen, um zu prüfen, ob er abgeschnitten wird</text>
+ <string name="payee_group">
+ Gruppe bezahlen
+ </string>
+ <string name="payee_resident">
+ Einwohner bezahlen
+ </string>
+ <text name="paying_text">
+ Sie zahlen:
+ </text>
+ <text left="130" name="payee_name">
+ Extrem langen Namen testen, um zu prüfen, ob er abgeschnitten wird
+ </text>
+ <text name="payment_message_label">
+ Beschreibung (optional):
+ </text>
<panel label="Suchen" name="PatternsPanel">
<button label="L$ 1 zahlen" label_selected="L$ 1 zahlen" name="fastpay 1"/>
<button label="L$ 5 zahlen" label_selected="L$ 5 zahlen" name="fastpay 5"/>
@@ -11,7 +22,9 @@
<button label="L$ 20 zahlen" label_selected="L$ 20 zahlen" name="fastpay 20"/>
</panel>
<panel label="Suchen" name="InputPanel">
- <text name="amount text">Anderer Betrag:</text>
+ <text name="amount text">
+ Anderer Betrag:
+ </text>
<button label="Bezahlen" label_selected="Bezahlen" name="pay btn"/>
<button label="Abbrechen" label_selected="Abbrechen" name="cancel btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/floater_script_queue.xml b/indra/newview/skins/default/xui/de/floater_script_queue.xml
index f267fe4b7c..d11ce83a3e 100644
--- a/indra/newview/skins/default/xui/de/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/de/floater_script_queue.xml
@@ -15,5 +15,11 @@
<floater.string name="NotRunning">
Läuft nicht
</floater.string>
+ <floater.string name="Timeout">
+ Timeout: [OBJECT_NAME]
+ </floater.string>
+ <floater.string name="LoadingObjInv">
+ Inventar wird geladen für: [OBJECT_NAME]
+ </floater.string>
<button label="Schließen" label_selected="Schließen" left="215" name="close" width="72"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_web_content.xml b/indra/newview/skins/default/xui/de/floater_web_content.xml
index 6ab119eeab..c5c6eb969f 100644
--- a/indra/newview/skins/default/xui/de/floater_web_content.xml
+++ b/indra/newview/skins/default/xui/de/floater_web_content.xml
@@ -10,5 +10,9 @@
<icon name="media_secure_lock_flag" tool_tip="Sicheres Browsen"/>
<button name="popexternal" tool_tip="Aktuelle URL im Desktop-Browser öffnen"/>
</layout_panel>
+ <layout_panel name="debug_controls">
+ <button name="web_test_home_page" tool_tip="Webtests Homepage"/>
+ <button name="VLC Plugin Test" tool_tip="MPEG4-Videotest"/>
+ </layout_panel>
</layout_stack>
</floater>
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 ba1b36db06..e0f0ea72ed 100644
--- a/indra/newview/skins/default/xui/de/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/de/menu_attachment_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="Anrufen" name="Call"/>
<menu_item_call label="In Gruppe einladen" name="Invite..."/>
<menu_item_call label="Skelett zurücksetzen" name="Reset Skeleton"/>
+ <menu_item_call label="Skelett und Animationen zurücksetzen" name="Reset Skeleton And Animations"/>
<menu_item_call label="Ignorieren" name="Avatar Mute"/>
<menu_item_call label="Melden" name="abuse"/>
<menu_item_call label="Einfrieren" name="Freeze..."/>
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 cd24e6ad3f..f477b78b38 100644
--- a/indra/newview/skins/default/xui/de/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/de/menu_attachment_self.xml
@@ -10,6 +10,7 @@
<menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
<menu_item_call label="Schwebehöhe" name="Hover Height"/>
<menu_item_call label="Skelett zurücksetzen" name="Reset Skeleton"/>
+ <menu_item_call label="Skelett und Animationen zurücksetzen" name="Reset Skeleton And Animations"/>
<menu_item_call label="Meine Freunde" name="Friends..."/>
<menu_item_call label="Meine Gruppen" name="Groups..."/>
<menu_item_call label="Mein Profil" name="Profile..."/>
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 447655cde7..9c24dc2199 100644
--- a/indra/newview/skins/default/xui/de/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/de/menu_avatar_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="Anrufen" name="Call"/>
<menu_item_call label="In Gruppe einladen" name="Invite..."/>
<menu_item_call label="Skelett zurücksetzen" name="Reset Skeleton"/>
+ <menu_item_call label="Skelett und Animationen zurücksetzen" name="Reset Skeleton And Animations"/>
<menu_item_call label="Ignorieren" name="Avatar Mute"/>
<menu_item_call label="Melden" name="abuse"/>
<menu_item_call label="Einfrieren" name="Freeze..."/>
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 f4a3cc17b8..9b6e267b42 100644
--- a/indra/newview/skins/default/xui/de/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/de/menu_avatar_self.xml
@@ -27,6 +27,7 @@
<menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
<menu_item_call label="Schwebehöhe" name="Hover Height"/>
<menu_item_call label="Skelett zurücksetzen" name="Reset Skeleton"/>
+ <menu_item_call label="Skelett und Animationen zurücksetzen" name="Reset Skeleton And Animations"/>
<menu_item_call label="Meine Freunde" name="Friends..."/>
<menu_item_call label="Meine Gruppen" name="Groups..."/>
<menu_item_call label="Mein Profil" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/de/menu_login.xml b/indra/newview/skins/default/xui/de/menu_login.xml
index 2dc4c1d687..ff21f07943 100644
--- a/indra/newview/skins/default/xui/de/menu_login.xml
+++ b/indra/newview/skins/default/xui/de/menu_login.xml
@@ -20,13 +20,12 @@
<menu_item_check label="Debug-Menü anzeigen" name="Show Debug Menu"/>
<menu label="Debug" name="Debug">
<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"/>
<menu label="UI-Tests" name="UI Tests"/>
<menu_item_call label="Fenstergröße einstellen..." name="Set Window Size..."/>
<menu_item_call label="Servicebedingungen anzeigen" name="TOS"/>
<menu_item_call label="Wichtige Meldung anzeigen" name="Critical"/>
- <menu_item_call label="Web Content Floater Debug Test" name="Web Content Floater Debug Test"/>
+ <menu_item_call label="Medienbrowser" name="Media Browser"/>
<menu label="Protokollierungsstufe festlegen" name="Set Logging Level">
<menu_item_check label="Debug" name="Debug"/>
<menu_item_check label="Info" name="Info"/>
diff --git a/indra/newview/skins/default/xui/de/menu_object_icon.xml b/indra/newview/skins/default/xui/de/menu_object_icon.xml
index f92fa0f82b..f2f3dddd0b 100644
--- a/indra/newview/skins/default/xui/de/menu_object_icon.xml
+++ b/indra/newview/skins/default/xui/de/menu_object_icon.xml
@@ -2,6 +2,7 @@
<menu name="Object Icon Menu">
<menu_item_call label="Objektprofil..." name="Object Profile"/>
<menu_item_call label="Ignorieren..." name="Block"/>
+ <menu_item_call label="Freischalten" name="Unblock"/>
<menu_item_call label="Auf Karte anzeigen" name="show_on_map"/>
<menu_item_call label="Zu Objektposition teleportieren" name="teleport_to_object"/>
</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_outfit_gear.xml b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml
index 0cf3c09882..211cc5c54e 100644
--- a/indra/newview/skins/default/xui/de/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml
@@ -3,6 +3,10 @@
<menu_item_call label="Anziehen - Aktuelles Outfit ersetzen" name="wear"/>
<menu_item_call label="Anziehen - Aktuelles Outfit hinzufügen" name="wear_add"/>
<menu_item_call label="Ausziehen - Aus aktuellem Outfit entfernen" name="take_off"/>
+ <menu_item_call label="Foto hochladen (10 L$)" name="upload_photo"/>
+ <menu_item_call label="Foto auswählen" name="select_photo"/>
+ <menu_item_call label="Schnappschuss aufnehmen" name="take_snapshot"/>
+ <menu_item_call label="Foto entfernen" name="remove_photo"/>
<menu label="Neue Kleider" name="New Clothes">
<menu_item_call label="Neues Hemd" name="New Shirt"/>
<menu_item_call label="Neue Hose" name="New Pants"/>
@@ -27,4 +31,5 @@
<menu_item_call label="Alle Ordner schließen" name="collapse"/>
<menu_item_call label="Outfit neu benennen" name="rename"/>
<menu_item_call label="Outfit löschen" name="delete_outfit"/>
+ <menu_item_check label="Ordner immer nach Namen sortieren" name="sort_folders_by_name"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_friends_view.xml b/indra/newview/skins/default/xui/de/menu_people_friends_view.xml
index da4890fe96..d6c4d419fa 100644
--- a/indra/newview/skins/default/xui/de/menu_people_friends_view.xml
+++ b/indra/newview/skins/default/xui/de/menu_people_friends_view.xml
@@ -4,5 +4,6 @@
<menu_item_check label="Nach Status sortieren" name="sort_status"/>
<menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
<menu_item_check label="Erteilte Genehmigungen anzeigen" name="view_permissions"/>
+ <menu_item_check label="Benutzernamen ausblenden" name="view_usernames"/>
<menu_item_check label="Unterhaltungsprotokoll anzeigen..." name="view_conversation"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby.xml b/indra/newview/skins/default/xui/de/menu_people_nearby.xml
index cdbb3ae917..40914b6f68 100644
--- a/indra/newview/skins/default/xui/de/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/de/menu_people_nearby.xml
@@ -13,4 +13,6 @@
<menu_item_call label="Freigeben" name="share"/>
<menu_item_call label="Bezahlen" name="pay"/>
<menu_item_check label="Ignorieren/Nicht mehr ignorieren" name="block_unblock"/>
+ <menu_item_call label="Einfrieren" name="freeze"/>
+ <menu_item_call label="Hinauswerfen" name="eject"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/de/menu_people_nearby_view.xml
index d38ec65037..61cc4fe098 100644
--- a/indra/newview/skins/default/xui/de/menu_people_nearby_view.xml
+++ b/indra/newview/skins/default/xui/de/menu_people_nearby_view.xml
@@ -5,4 +5,5 @@
<menu_item_check label="Nach Nähe sortieren" name="sort_distance"/>
<menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
<menu_item_check label="Karte anzeigen" name="view_map"/>
+ <menu_item_check label="Benutzernamen ausblenden" name="view_usernames"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_url_objectim.xml b/indra/newview/skins/default/xui/de/menu_url_objectim.xml
index fc01ea8444..95fe97407b 100644
--- a/indra/newview/skins/default/xui/de/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/de/menu_url_objectim.xml
@@ -2,6 +2,7 @@
<context_menu name="Url Popup">
<menu_item_call label="Objektprofil..." name="show_object"/>
<menu_item_call label="Blockieren..." name="block_object"/>
+ <menu_item_call label="Freischalten" name="unblock_object"/>
<menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
<menu_item_call label="Zu Objekt-Position teleportieren" name="teleport_to_object"/>
<menu_item_call label="Objektname in Zwischenablage kopieren" name="url_copy_label"/>
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index 319162db34..db57e41661 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -113,11 +113,11 @@
<menu_item_call label="Verknüpfung" name="Link"/>
<menu_item_call label="Verknüpfung auflösen" name="Unlink"/>
<menu_item_check label="Verknüpfte Teile bearbeiten" name="Edit Linked Parts"/>
- <menu label="Verknüpfte Teile auswählen" name="Select Linked Parts">
- <menu_item_call label="Nächstes Teil auswählen" name="Select Next Part"/>
- <menu_item_call label="Vorheriges Teil auswählen" name="Select Previous Part"/>
- <menu_item_call label="Nächsten Teil mit einsschließen" name="Include Next Part"/>
- <menu_item_call label="Vorherige Teile mit einschließen" name="Include Previous Part"/>
+ <menu label="Elemente auswählen" name="Select Elements">
+ <menu_item_call label="Nächsten Teil oder nächste Fläche auswählen" name="Select Next Part or Face"/>
+ <menu_item_call label="Vorherigen Teil oder vorherige Fläche auswählen" name="Select Previous Part or Face"/>
+ <menu_item_call label="Nächsten Teil oder nächste Fläche einschließen" name="Include Next Part or Face"/>
+ <menu_item_call label="Vorherigen Teil oder vorherige Fläche einschließen" name="Include Previous Part or Face"/>
</menu>
<menu_item_call label="Linksets..." name="pathfinding_linkset_menu_item"/>
<menu_item_call label="Fokus auf Auswahl" name="Focus on Selection"/>
@@ -368,8 +368,7 @@
<menu_item_call label="Regionsobjekt-Cache ausgeben" name="Dump Region Object Cache"/>
</menu>
<menu label="UI" name="UI">
- <menu_item_call label="Test Medienbrowser" name="Web Browser Test"/>
- <menu_item_call label="Webinhaltsbrowser" name="Web Content Browser"/>
+ <menu_item_call label="Medienbrowser" name="Media Browser"/>
<menu_item_call label="SelectMgr ausgeben" name="Dump SelectMgr"/>
<menu_item_call label="Inventarinfo ausgeben" name="Dump Inventory"/>
<menu_item_call label="Timer ausgeben" name="Dump Timers"/>
diff --git a/indra/newview/skins/default/xui/de/menu_wearing_tab.xml b/indra/newview/skins/default/xui/de/menu_wearing_tab.xml
index 695451a105..61002b3dad 100644
--- a/indra/newview/skins/default/xui/de/menu_wearing_tab.xml
+++ b/indra/newview/skins/default/xui/de/menu_wearing_tab.xml
@@ -3,4 +3,6 @@
<menu_item_call label="Ausziehen" name="take_off"/>
<menu_item_call label="Abnehmen" name="detach"/>
<menu_item_call label="Outfit bearbeiten" name="edit"/>
+ <menu_item_call label="Bearbeiten" name="edit_item"/>
+ <menu_item_call label="Original anzeigen" name="show_original"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/de/mime_types.xml b/indra/newview/skins/default/xui/de/mime_types.xml
index ee05e47a63..8728a57737 100644
--- a/indra/newview/skins/default/xui/de/mime_types.xml
+++ b/indra/newview/skins/default/xui/de/mime_types.xml
@@ -57,6 +57,11 @@
Echtzeit-Streaming
</label>
</scheme>
+ <scheme name="libvlc">
+ <label name="libvlc_label">
+ Von LibVLC unterstützte Medien
+ </label>
+ </scheme>
<mimetype name="blank">
<label name="blank_label">
- Keine -
@@ -202,6 +207,11 @@
Video (MP4)
</label>
</mimetype>
+ <mimetype name="application/octet-stream">
+ <label name="video/octet-stream">
+ Film
+ </label>
+ </mimetype>
<mimetype menu="1" name="video/quicktime">
<label name="video/quicktime_label">
Video (QuickTime)
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index 0af00ab705..25e013ed90 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -336,6 +336,9 @@ Wenn diese Rolle nicht mehr diese Fähigkeiten haben soll, deaktivieren Sie sie
Sie sind dabei, [COUNT] Mitglieder aus der Gruppe zu verbannen.
<usetemplate ignoretext="Verbannen mehrerer Gruppenmitglieder bestätigen" name="okcancelignore" notext="Abbrechen" yestext="Verbannen"/>
</notification>
+ <notification name="GroupBanUserOnBanlist">
+ Manchen Einwohnern wurde keine Einladung gesendet, weil sie aus der Gruppe ausgeschlossen sind.
+ </notification>
<notification name="AttachmentDrop">
Sie möchten Ihren Anhang wirklich fallen lassen?
Möchten Sie fortfahren?
@@ -464,6 +467,12 @@ Um Medien nur auf einer Fläche einzufügen, wählen Sie „Oberfläche auswähl
<notification name="ErrorEncodingSnapshot">
Fehler beim Erstellen des Fotos!
</notification>
+ <notification name="ErrorPhotoCannotAfford">
+ Es kostet L$[COST], um ein Foto in Ihrem Inventar zu speichern. Sie können entweder L$ kaufen oder das Foto auf Ihrem Computer speichern.
+ </notification>
+ <notification name="ErrorTextureCannotAfford">
+ Es kostet L$[COST], um eine Textur in Ihrem Inventar zu speichern. Sie können entweder L$ kaufen oder das Foto auf Ihrem Computer speichern.
+ </notification>
<notification name="ErrorUploadingPostcard">
Ein Foto konnte aus folgendem Grund nicht gesendet werden: [REASON]
</notification>
@@ -582,6 +591,10 @@ Hinweis: Der Cache wird dabei gelöscht/geleert.
Notizkarte löschen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
+ <notification name="LoadPreviousReportScreenshot">
+ Möchten Sie den vorherigen Screenshot für Ihren Bericht verwenden?
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
Speichern der Geste fehlgeschlagen.
Die Geste besteht aus zu vielen Schritten.
@@ -642,30 +655,12 @@ Weitere Informationen finden Sie auf [_URL].
</url>
<usetemplate ignoretext="Meine Hardware wird nicht unterstützt" name="okcancelignore" notext="Nein" yestext="Ja"/>
</notification>
- <notification name="IntelOldDriver">
- Wahrscheinlich gibt es einen neueren Treiber für Ihren Grafikchip. Durch Aktualisieren der Grafiktreiber lässt sich die Leistung u. U. beträchtlich verbessern.
-
- Unter [_URL] nach aktualisierten Treibern suchen?
- <url name="url">
- http://www.intel.com/p/de_DE/support/detect/graphics
- </url>
- <usetemplate ignoretext="Mein Grafiktreiber ist veraltet" name="okcancelignore" notext="Nein" yestext="Ja"/>
- </notification>
- <notification name="AMDOldDriver">
- Wahrscheinlich gibt es einen neueren Treiber für Ihren Grafikchip. Durch Aktualisieren der Grafiktreiber lässt sich die Leistung u. U. beträchtlich verbessern.
-
- Unter [_URL] nach aktualisierten Treibern suchen?
- <url name="url">
- http://support.amd.com/de/Pages/AMDSupportHub.aspx
- </url>
- <usetemplate ignoretext="Mein Grafiktreiber ist veraltet" name="okcancelignore" notext="Nein" yestext="Ja"/>
- </notification>
- <notification name="NVIDIAOldDriver">
+ <notification name="OldGPUDriver">
Wahrscheinlich gibt es einen neueren Treiber für Ihren Grafikchip. Durch Aktualisieren der Grafiktreiber lässt sich die Leistung u. U. beträchtlich verbessern.
- Unter [_URL] nach aktualisierten Treibern suchen?
+ Unter [URL] nach aktualisierten Treibern suchen?
<url name="url">
- http://www.nvidia.com/Download/index.aspx?lang=de-de
+ [URL]
</url>
<usetemplate ignoretext="Mein Grafiktreiber ist veraltet" name="okcancelignore" notext="Nein" yestext="Ja"/>
</notification>
@@ -756,6 +751,9 @@ Verschieben Sie alle betreffenden Objekte in dieselbe Region.
</url>
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
+ <notification name="MuteLimitReached">
+ Sie können keinen weiteren Eintrag zur Liste der ignorierten Einwohner hinzufügen, weil der Höchstwert ([MUTE_LIMIT] Einträge) erreicht ist.
+ </notification>
<notification name="UnableToLinkObjects">
Verknüpfung dieser [COUNT] Objekte nicht möglich.
Sie können maximal [MAX] Objekte verknüpfen.
@@ -1393,6 +1391,11 @@ Sie können [SECOND_LIFE] normal verwenden. Andere Benutzer können Sie korrekt
</notification>
<notification name="AgentComplexity">
Ihre [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 Avatarkomplexität] ist [AGENT_COMPLEXITY].
+ <usetemplate ignoretext="Warnung anzeigen, wenn sich die Komplexität meines Avatars ändert" name="notifyignore"/>
+ </notification>
+ <notification name="HUDComplexityWarning">
+ [HUD_REASON]; dies wirkt sich wahrscheinlich negativ auf die Leistung aus.
+ <usetemplate ignoretext="Warnung anzeigen, wenn die Komplexität meines HUD zu hoch ist" name="notifyignore"/>
</notification>
<notification name="FirstRun">
Installation von [APP_NAME] vollständig abgeschlossen.
@@ -1485,6 +1488,10 @@ Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
Alle Einwohner in dieser Region nach Hause teleportieren?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
+ <notification name="ChangeObjectBonusFactor">
+ Wenn Sie den Objektbonus heruntersetzen, nachdem in einer Region Bauwerke errichtet wurden, können Objekte möglicherweise zurückgegeben oder gelöscht werden. Möchten Sie den Objektbonus wirklich ändern?
+ <usetemplate ignoretext="Änderung des Objektbonusfaktors bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ </notification>
<notification name="EstateObjectReturn">
Möchten Sie wirklich alle Objekte zurückgeben, die [USER_NAME] gehören?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
@@ -1532,6 +1539,9 @@ Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 un
<notification name="OwnerCanNotBeDenied">
Der Eigentümer des Grundbesitzes kann nicht zur Liste der „Verbannten Einwohner“ hinzugefügt werden.
</notification>
+ <notification name="ProblemAddingEstateManagerBanned">
+ Verbannter Einwohner kann nicht zur Grundbesitzverwalterliste hinzugefügt werden.
+ </notification>
<notification name="CanNotChangeAppearanceUntilLoaded">
Das Aussehen lässt sich erst ändern, wenn Kleider und Form/Gestalt geladen sind.
</notification>
@@ -1703,6 +1713,10 @@ Wenn Sie die neuesten Features und Fixes ausprobieren möchten, gehen Sie zur Se
Möchten Sie Ihren Internetbrowser öffnen, um diesen Inhalt anzuzeigen?
<usetemplate ignoretext="Meinen Browser starten, um eine Webseite anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
+ <notification name="SystemUIScaleFactorChanged">
+ Der UI-Größenfaktor des Systems hat sich seit der letzten Ausführung geändert. Möchten Sie die Seite mit den UI-Größeneinstellungen öffnen?
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+ </notification>
<notification name="WebLaunchJoinNow">
Möchten Sie Ihre [http://secondlife.com/account/ Startseite] aufrufen, um Ihr Konto zu verwalten?
<usetemplate ignoretext="Meinen Browser starten, um mein Konto zu verwalten" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
@@ -1742,10 +1756,17 @@ Wenn Sie die neuesten Features und Fixes ausprobieren möchten, gehen Sie zur Se
Diese Gruppe verlassen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
+ <notification name="GroupDepart">
+ Sie haben die Gruppe „[group_name]“ verlassen.
+ </notification>
<notification name="OwnerCannotLeaveGroup">
Sie können die Gruppe nicht verlassen, da Sie der letzte Besitzer der Gruppe sind. Weisen Sie die Besitzerrolle zuerst einem anderen Mitglied zu.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="GroupDepartError">
+ Sie können die Gruppe nicht verlassen,
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="ConfirmKick">
Möchten Sie WIRKLICH alle Benutzer aus dem Grid werfen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Alle Benutzer hinauswerfen"/>
@@ -2145,6 +2166,10 @@ Tausende Regionen werden verändert und der Spaceserver wird dadurch stark belas
Zu viele Prims wurden ausgewählt. Bitte wählen Sie höchstens [MAX_PRIM_COUNT] Prims aus und versuchen Sie es erneut.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="TooManyScriptsSelected">
+ Zu viele Skripts in den Objekten ausgewählt. Bitte wählen Sie weniger Objekte aus und versuchen Sie es erneut.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="ProblemImportingEstateCovenant">
Problem beim Import des Grundbesitzvertrags.
<usetemplate name="okbutton" yestext="OK"/>
@@ -2314,6 +2339,10 @@ Inventarobjekt(e) verschieben?
Zahlung fehlgeschlagen: Objekt nicht gefunden.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="PaymentBlockedButtonMismatch">
+ Zahlung gestoppt: Der bezahlte Preis stimmt nicht mit den für dieses Objekt definierten Zahlungsschaltflächen überein.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
Sie haben keine Berechtigung zum Kopieren von Elementen in diesem Objekt.
</notification>
@@ -2349,6 +2378,11 @@ Diese Aktion kann nicht rückgängig gemacht werden.
Dies ist eine große Auswahl mit Linksets. Wenn Sie die Verknüpfung auflösen, kann sie möglicherweise nicht erneut hergestellt werden. Als Vorsichtsmaßnahme empfiehlt es sich, Kopien von Linksets in Ihr Inventar aufzunehmen.
<usetemplate ignoretext="Auflösen der Verknüpfung eines Linksets bestätigen" name="okcancelignore" notext="Abbrechen" yestext="Verknüpfung auflösen"/>
</notification>
+ <notification name="HelpReportAbuseConfirm">
+ Vielen Dank, dass Sie uns über dieses Problem informiert haben.
+Wir untersuchen Ihre Meldung, um zu bestimmen, ob ein Missbrauch vorliegt, und werden dann die entsprechende Maßnahme ergreifen.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="HelpReportAbuseSelectCategory">
Wählen Sie eine Missbrauchskategorie aus.
Die Angabe einer Kategorie hilft uns bei der Bearbeitung des Berichts.
@@ -2776,6 +2810,10 @@ Fliegen ist hier nicht möglich.
<notification name="PathfindingDirty">
Diese Region weist ausstehende Pathfinding-Änderungen auf. Wenn Sie Baurechte besitzen, können Sie die Region durch Klicken auf die Schaltfläche „Region neu formen“ neu formen.
</notification>
+ <notification name="PathfindingDirtyRebake">
+ Diese Region weist ausstehende Pathfinding-Änderungen auf. Wenn Sie Baurechte besitzen, können Sie die Region durch Klicken auf die Schaltfläche „Region neu formen“ neu formen.
+ <usetemplate name="okbutton" yestext="Region neu formen"/>
+ </notification>
<notification name="DynamicPathfindingDisabled">
Dynamisches Pathfinding ist in dieser Region nicht aktiviert. Geskriptete Objekte, die Pathfinding-LSL-Aufrufe verwenden, funktionieren in dieser Region u. U. nicht wie erwartet.
</notification>
@@ -3284,10 +3322,12 @@ Diese werden für ein paar Sekunden sicherheitshalber gesperrt.
</notification>
<notification name="AppearanceToXMLFailed">
Fehler beim Speichern des Erscheinungsbilds als XML.
- icon=&quot;notifytip.tga&quot;
- name=&quot;PresetNotDeleted&quot;
- type=&quot;notifytip&quot;&gt;
-Fehler beim Löschen der Voreinstellung [NAME].
+ </notification>
+ <notification name="PresetNotSaved">
+ Fehler beim Speichern der Voreinstellung [NAME].
+ </notification>
+ <notification name="PresetNotDeleted">
+ Fehler beim Löschen der Voreinstellung [NAME].
</notification>
<notification name="UnableToFindHelpTopic">
Hilfethema für dieses Element wurde nicht gefunden.
@@ -3495,13 +3535,6 @@ Durch Ausblenden der Schaltfläche „Sprechen“ wird die Sprechfunktion deakti
<notification name="ForceQuitDueToLowMemory">
SL wird wegen Speichermangel in 30 Sekunden beendet.
</notification>
- <notification name="PopupAttempt">
- Ein Popup konnte nicht geöffnet werden.
- <form name="form">
- <ignore name="ignore" text="Alle Popups aktivieren"/>
- <button name="open" text="Popup-Fenster öffnen"/>
- </form>
- </notification>
<notification name="SOCKS_NOT_PERMITTED">
SOCKS 5-Proxy „[HOST]:[PORT]“ hat Verbindungsverbindung abgewiesen, da laut Regelsatz nicht zulässig.
<usetemplate name="okbutton" yestext="OK"/>
@@ -3876,6 +3909,9 @@ Warten Sie kurz und versuchen Sie es noch einmal.
Objekt „[OBJECT_NAME]“ kann nicht nach
[OBJ_POSITION] in Region [REGION_NAME] verschoben werden, da nicht genügend Ressourcen für dieses Objekt auf dieser Parzelle vorhanden sind.
</notification>
+ <notification name="NoParcelPermsNoObject">
+ Kopiervorgang fehlgeschlagen, da Sie keinen Zugriff auf diese Parzelle haben.
+ </notification>
<notification name="CantMoveObjectRegionVersion">
Objekt „[OBJECT_NAME]“ kann nicht nach
[OBJ_POSITION] in Region [REGION_NAME] verschoben werden, da die andere Region eine ältere Version verwendet, die das Empfangen dieses Objekts per Regionswechsel nicht unterstützt.
@@ -3891,6 +3927,10 @@ Warten Sie kurz und versuchen Sie es noch einmal.
<notification name="NoPermModifyObject">
Ihnen fehlt die Berechtigung zum Modifizieren dieses Objekts.
</notification>
+ <notification name="TooMuchObjectInventorySelected">
+ Zu viele Objekte mit umfangreichem Inventar ausgewählt. Bitte wählen Sie weniger Objekte aus und versuchen Sie es erneut.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CantEnablePhysObjContributesToNav">
Physik kann nicht für ein Objekt aktiviert werden, das zum Navmesh beiträgt.
</notification>
@@ -3927,6 +3967,12 @@ Warten Sie kurz und versuchen Sie es noch einmal.
<notification name="CantSaveModifyAttachment">
Kein Speichern in Objektinhalt möglich: Dadurch würden die Anhängeberechtigungen geändert.
</notification>
+ <notification name="AttachmentHasTooMuchInventory">
+ Ihre Anhänge enthalten zu viele Inventarobjekte. Sie können keine weiteren hinzufügen.
+ </notification>
+ <notification name="IllegalAttachment">
+ Der Anhang hat einen nicht vorhandenen Punkt auf dem Avatar angefordert. Der Anhang wurde stattdessen auf der Brust angebracht.
+ </notification>
<notification name="TooManyScripts">
Zu viele Skripts.
</notification>
@@ -4019,6 +4065,12 @@ Warten Sie kurz und versuchen Sie es noch einmal.
<notification name="TeleportedByObjectUnknownUser">
Sie wurden von Objekt „[OBJECT_NAME]“, das einem unbekannten Benutzer gehört, teleportiert.
</notification>
+ <notification name="StandDeniedByObject">
+ „[OBJECT_NAME]“ lässt zur Zeit nicht zu, dass Sie stehen.
+ </notification>
+ <notification name="ResitDeniedByObject">
+ „[OBJECT_NAME]“ lässt zur Zeit nicht zu, dass Sie sich woanders hinsetzen.
+ </notification>
<notification name="CantCreateObjectRegionFull">
Angefordertes Objekt kann nicht erstellt werden. Die Region ist voll.
</notification>
@@ -4100,9 +4152,6 @@ Warten Sie kurz und versuchen Sie es noch einmal.
<notification name="CantAttachNotEnoughScriptResources">
Nicht genügend Skriptressourcen verfügbar, um Objekt anzuhängen.
</notification>
- <notification name="IllegalAttachment">
- Der Anhang hat einen nicht vorhandenen Punkt auf dem Avatar angefordert. Der Anhang wurde stattdessen auf der Brust angebracht.
- </notification>
<notification name="CantDropItemTrialUser">
Ablegen von Objekten hier nicht möglich; versuchen Sie es mit dem kostenlosen Testbereich.
</notification>
@@ -4318,6 +4367,9 @@ Wählen Sie eine kleinere Landfläche aus.
<notification name="CantTransfterMoneyRegionDisabled">
Geldüberweisungen an Objekte sind in dieser Region gegenwärtig deaktiviert.
</notification>
+ <notification name="DroppedMoneyTransferRequest">
+ Zahlung konnte aufgrund der Systembelastung nicht durchgeführt werden.
+ </notification>
<notification name="CantPayNoAgent">
Nicht ersichtlich, wer bezahlt werden muss.
</notification>
@@ -4353,4 +4405,8 @@ Wählen Sie eine kleinere Landfläche aus.
Chatverlaufsdatei ist noch mit vorheriger Operation beschäftigt. Versuchen Sie es in ein paar Minuten noch einmal oder chatten Sie mit einer anderen Person.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="OutfitPhotoLoadError">
+ [REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
</notifications>
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 d5158b2d97..365269d95e 100644
--- a/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml
@@ -7,6 +7,7 @@
Ausgewählte Objekte tragen
</panel.string>
<tab_container name="appearance_tabs">
+ <panel label="OUTFIT-GALERIE" name="outfit_gallery_tab"/>
<panel label="MEINE OUTFITS" name="outfitslist_tab"/>
<panel label="AKTUELLES OUTFIT" name="cof_tab"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/de/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/de/panel_outfits_wearing.xml
index 27141796a8..10c31d334c 100644
--- a/indra/newview/skins/default/xui/de/panel_outfits_wearing.xml
+++ b/indra/newview/skins/default/xui/de/panel_outfits_wearing.xml
@@ -1,6 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Wearing">
+ <panel.string name="no_attachments">
+ Keine Anhänge getragen.
+ </panel.string>
+ <accordion name="wearables_accordion">
+ <accordion_tab name="tab_wearables" title="Tragbare Objekte"/>
+ <accordion_tab name="tab_temp_attachments" title="Temporäre Anhänge"/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
+ <menu_button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
index dc456e2281..4414bbfae7 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
@@ -30,6 +30,7 @@
<combo_box.item label="Ich werde Updates manuell herunterladen und installieren" name="Install_manual"/>
</combo_box>
<check_box label="Bereit, Release-Kandidaten zu verwenden" name="update_willing_to_test"/>
+ <check_box label="Versionshinweise nach der Aktualisierung anzeigen" name="update_show_release_notes"/>
<text name="Proxy Settings:">
Proxy-Einstellungen:
</text>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 9dd94d2230..4a2cbcc81f 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -61,17 +61,34 @@ Grafikkarte: [GRAPHICS_CARD]
<string name="AboutDriver">
Windows-Grafiktreiberversion: [GRAPHICS_DRIVER_VERSION]
</string>
- <string name="AboutLibs">
+ <string name="AboutOGL">
OpenGL-Version: [OPENGL_VERSION]
-
-J2C-Decoderversion: [J2C_VERSION]
+ </string>
+ <string name="AboutSettings">
+ Fenstergröße: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
+Schriftgrößenanpassung [FONT_SIZE_ADJUSTMENT] Pt
+UI-Skalierung: [UI_SCALE]
+Sichtweite: [DRAW_DISTANCE] m
+Bandbreite: [NET_BANDWITH] kbit/s
+LOD-Faktor: [LOD_FACTOR]
+Darstellungsqualität: [RENDER_QUALITY] / 7
+Erweitertes Beleuchtungsmodell: [GPU_SHADERS]
+Texturspeicher: [TEXTURE_MEMORY] MB
+Erstellungszeit VFS (Cache): [VFS_TIME]
+ </string>
+ <string name="AboutLibs">
+ J2C-Decoderversion: [J2C_VERSION]
Audiotreiberversion: [AUDIO_DRIVER_VERSION]
LLCEFLib/CEF-Version: [LLCEFLIB_VERSION]
+LibVLC-Version: [LIBVLC_VERSION]
Voice-Server-Version: [VOICE_VERSION]
</string>
<string name="AboutTraffic">
Paketverlust: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1] %)
</string>
+ <string name="AboutTime">
+ [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]
+ </string>
<string name="ErrorFetchingServerReleaseNotesURL">
Fehler beim Abrufen der URL für die Server-Versionshinweise.
</string>
@@ -1089,6 +1106,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="TeleportYourAgent">
Sie teleportieren
</string>
+ <string name="ForceSitAvatar">
+ Ihren Avatar zwingen, sich zu setzen
+ </string>
<string name="NotConnected">
Nicht verbunden
</string>
@@ -1937,6 +1957,27 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="av_render_anyone">
Sie sind u. U. für niemanden in Ihrer Nähe sichtbar.
</string>
+ <string name="hud_description_total">
+ Ihr HUD
+ </string>
+ <string name="hud_name_with_joint">
+ [OBJ_NAME] (getragen von [JNT_NAME])
+ </string>
+ <string name="hud_render_memory_warning">
+ [HUD_DETAILS] beansprucht viel Texturspeicher
+ </string>
+ <string name="hud_render_cost_warning">
+ [HUD_DETAILS] enthält zu viele ressourcenintensive Objekte und Texturen
+ </string>
+ <string name="hud_render_heavy_textures_warning">
+ [HUD_DETAILS] enthält viele große Texturen
+ </string>
+ <string name="hud_render_cramped_warning">
+ [HUD_DETAILS] enthält zu viele Objekte
+ </string>
+ <string name="hud_render_textures_warning">
+ [HUD_DETAILS] enthält zu viele Texturen
+ </string>
<string name="AgeYearsA">
[COUNT] Jahr
</string>
@@ -2096,6 +2137,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="ObjectOutOfRange">
Skript (Objekt außerhalb des Bereichs)
</string>
+ <string name="ScriptWasDeleted">
+ Skript (aus Inventar gelöscht)
+ </string>
<string name="GodToolsObjectOwnedBy">
Objekt [OBJECT], Besitzer [OWNER]
</string>
@@ -2708,6 +2752,15 @@ Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh
<string name="Play Media">
Medien Abspielen/Pausieren
</string>
+ <string name="IntelDriverPage">
+ http://www.intel.com/p/en_US/support/detect/graphics
+ </string>
+ <string name="NvidiaDriverPage">
+ http://www.nvidia.com/Download/index.aspx?lang=de-de
+ </string>
+ <string name="AMDDriverPage">
+ http://support.amd.com/de/Pages/AMDSupportHub.aspx
+ </string>
<string name="MBCmdLineError">
Beim Parsen der Befehlszeile wurde ein Fehler festgestellt.
Weitere Informationen: http://wiki.secondlife.com/wiki/Client_parameters (EN)
@@ -4483,12 +4536,18 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="paid_you_ldollars">
[NAME] hat Ihnen [REASON] [AMOUNT] L$ bezahlt.
</string>
+ <string name="paid_you_ldollars_gift">
+ [NAME] hat Ihnen [AMOUNT] L$ bezahlt: [REASON]
+ </string>
<string name="paid_you_ldollars_no_reason">
[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_gift">
+ Sie haben [NAME] [AMOUNT] L$ bezahlt: [REASON]
+ </string>
<string name="you_paid_ldollars_no_info">
Sie haben [AMOUNT] L$ bezahlt.
</string>
@@ -4501,6 +4560,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="you_paid_failure_ldollars">
Sie haben [NAME] [AMOUNT] L$ [REASON] nicht bezahlt.
</string>
+ <string name="you_paid_failure_ldollars_gift">
+ Sie haben [NAME] [AMOUNT] L$ nicht bezahlt: [REASON]
+ </string>
<string name="you_paid_failure_ldollars_no_info">
Sie haben [AMOUNT] L$ nicht bezahlt.
</string>
@@ -4827,6 +4889,15 @@ Missbrauchsbericht
<string name="texture_load_dimensions_error">
Bilder, die größer sind als [WIDTH]*[HEIGHT] können nicht geladen werden
</string>
+ <string name="outfit_photo_load_dimensions_error">
+ Max. Fotogröße für Outfit ist [WIDTH]*[HEIGHT]. Bitte verkleinern Sie das Bild oder verwenden Sie ein anderes.
+ </string>
+ <string name="outfit_photo_select_dimensions_error">
+ Max. Fotogröße für Outfit ist [WIDTH]*[HEIGHT]. Bitte wählen Sie eine andere Textur aus.
+ </string>
+ <string name="outfit_photo_verify_dimensions_error">
+ Fotoabmessungen können nicht bestätigt werden. Bitte warten Sie, bis die Fotogröße im Auswahlfenster angezeigt wird.
+ </string>
<string name="words_separator" value=","/>
<string name="server_is_down">
Trotz all unserer Bemühungen ist ein unerwarteter Fehler aufgetreten.
@@ -5331,6 +5402,9 @@ Setzen Sie den Editorpfad in Anführungszeichen
<string name="Command_Profile_Label">
Profil
</string>
+ <string name="Command_Report_Abuse_Label">
+ Missbrauch melden
+ </string>
<string name="Command_Search_Label">
Suchen
</string>
@@ -5421,6 +5495,9 @@ Setzen Sie den Editorpfad in Anführungszeichen
<string name="Command_Profile_Tooltip">
Ihr Profil bearbeiten oder anzeigen
</string>
+ <string name="Command_Report_Abuse_Tooltip">
+ Missbrauch melden
+ </string>
<string name="Command_Search_Tooltip">
Orte, Veranstaltungen, Leute finden
</string>
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 8391bacf51..a137770e26 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -2014,7 +2014,7 @@ Only large parcels can be listed in search.
name="AllowedText"
top="0"
width="230">
- Allowed Residents ([COUNT])
+ Allowed Residents ([COUNT], max [MAX])
</text>
<name_list
column_padding="0"
@@ -2063,7 +2063,7 @@ Only large parcels can be listed in search.
name="BanCheck"
top="0"
width="200">
- Banned Residents ([COUNT])
+ Banned Residents ([COUNT], max [MAX])
</text>
<name_list
column_padding="0"
diff --git a/indra/newview/skins/default/xui/en/floater_avatar.xml b/indra/newview/skins/default/xui/en/floater_avatar.xml
index cd5cca02bd..92c5d8bcbe 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
positioning="cascading"
- ignore_ui_scale="false"
legacy_header_height="225"
can_minimize="true"
can_close="true"
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index 521389d7b3..72a7b5540c 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -43,13 +43,11 @@
name="controls"
width="226">
<panel
- color="Transparent"
follows="all"
height="102"
layout="topleft"
left="8"
name="preset_views_list"
- opaque="true"
top="24"
width="212"
visible="false">
@@ -100,14 +98,11 @@
</panel_camera_item>
</panel>
<panel
- color="Transparent"
follows="all"
height="68"
- item_pad="4"
layout="topleft"
left="8"
name="camera_modes_list"
- opaque="true"
top="24"
width="212"
visible="false">
diff --git a/indra/newview/skins/default/xui/en/floater_destinations.xml b/indra/newview/skins/default/xui/en/floater_destinations.xml
index 94ebaa9cb2..4fe8e3bdd1 100644
--- a/indra/newview/skins/default/xui/en/floater_destinations.xml
+++ b/indra/newview/skins/default/xui/en/floater_destinations.xml
@@ -1,11 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
positioning="cascading"
- ignore_ui_scale="false"
legacy_header_height="225"
can_minimize="true"
can_close="true"
- user_resize="true"
can_resize="true"
min_height="230"
min_width="350"
diff --git a/indra/newview/skins/default/xui/en/floater_edit_hover_height.xml b/indra/newview/skins/default/xui/en/floater_edit_hover_height.xml
index 8ec6735a01..52084e5f8e 100644
--- a/indra/newview/skins/default/xui/en/floater_edit_hover_height.xml
+++ b/indra/newview/skins/default/xui/en/floater_edit_hover_height.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
positioning="cascading"
- ignore_ui_scale="false"
legacy_header_height="225"
can_minimize="true"
can_close="true"
diff --git a/indra/newview/skins/default/xui/en/floater_facebook.xml b/indra/newview/skins/default/xui/en/floater_facebook.xml
index 2ea34fb751..b34d70516a 100644
--- a/indra/newview/skins/default/xui/en/floater_facebook.xml
+++ b/indra/newview/skins/default/xui/en/floater_facebook.xml
@@ -22,8 +22,7 @@
top="7"
height="437"
follows="all"
- halign="center"
- use_highlighting_on_hover="true">
+ halign="center">
<panel
filename="panel_facebook_status.xml"
class="llfacebookstatuspanel"
diff --git a/indra/newview/skins/default/xui/en/floater_flickr.xml b/indra/newview/skins/default/xui/en/floater_flickr.xml
index 24de3ddd8d..52ef16c7e8 100644
--- a/indra/newview/skins/default/xui/en/floater_flickr.xml
+++ b/indra/newview/skins/default/xui/en/floater_flickr.xml
@@ -29,8 +29,7 @@
top="7"
height="555"
follows="all"
- halign="center"
- use_highlighting_on_hover="true">
+ halign="center">
<panel
filename="panel_flickr_photo.xml"
class="llflickrphotopanel"
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 28c89868bd..34fa0b0fe9 100644
--- a/indra/newview/skins/default/xui/en/floater_im_container.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_container.xml
@@ -121,7 +121,6 @@
follows="all"
layout="topleft"
name="conversations_list_panel"
- opaque="true"
top_pad="0"
left="5"
right="-1"/>
@@ -144,7 +143,6 @@
follows="all"
layout="topleft"
name="stub_panel"
- opaque="true"
top_pad="0"
left="0"
right="-1">
diff --git a/indra/newview/skins/default/xui/en/floater_inspect.xml b/indra/newview/skins/default/xui/en/floater_inspect.xml
index bea35e5fc1..ae46736ddf 100644
--- a/indra/newview/skins/default/xui/en/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/en/floater_inspect.xml
@@ -27,15 +27,15 @@
tool_tip="Select an object from this list to highlight it in-world"
top="20">
<scroll_list.columns
- dynamic_width="true"
+ relative_width="0.32"
label="Object Name"
name="object_name" />
<scroll_list.columns
- dynamic_width="true"
+ relative_width="0.34"
label="Owner Name"
name="owner_name" />
<scroll_list.columns
- dynamic_width="true"
+ relative_width="0.34"
label="Creator Name"
name="creator_name" />
<scroll_list.columns
diff --git a/indra/newview/skins/default/xui/en/floater_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml
index 5e84283ab0..90166232e9 100644
--- a/indra/newview/skins/default/xui/en/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/en/floater_moveview.xml
@@ -155,7 +155,6 @@
layout="topleft"
name="move right btn"
quadrant="right"
- right_delta="4"
scale_image="false"
tool_tip="Walk right (press Shift + Right Arrow or D)"
top_pad="10"
@@ -210,7 +209,6 @@
image_pressed_selected="Movement_Down_On"
image_unselected="Movement_Down_Off"
layout="topleft"
- right_delta="0"
name="move down btn"
scale_image="false"
tool_tip="Fly down (press C)"
diff --git a/indra/newview/skins/default/xui/en/floater_outfit_photo_preview.xml b/indra/newview/skins/default/xui/en/floater_outfit_photo_preview.xml
new file mode 100644
index 0000000000..bfc1c39e9d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_outfit_photo_preview.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="false"
+ height="325"
+ layout="topleft"
+ name="outfit_photo_preview"
+ help_topic="preview_texture"
+ width="410">
+ <floater.string
+ name="Title">
+ Texture: [NAME]
+ </floater.string>
+ <floater.string
+ name="exceed_limits">
+ Max outfit photo size is [MAX_WIDTH]*[MAX_HEIGHT]. Please select another texture.
+ </floater.string>
+ <floater.string
+ name="photo_confirmation">
+ Set this as Outfit Photo for [OUTFIT]?
+ </floater.string>
+ <text
+ type="string"
+ halign="right"
+ length="1"
+ follows="right|bottom"
+ height="16"
+ layout="topleft"
+ left="110"
+ name="dimensions"
+ top="255"
+ width="200">
+ [WIDTH]px x [HEIGHT]px
+ </text>
+ <text
+ type="string"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="notification"
+ left="25"
+ halign="center"
+ top_pad="5"
+ width="360">
+ </text>
+ <button
+ follows="right|bottom"
+ height="22"
+ label="OK"
+ layout="topleft"
+ name="ok_btn"
+ top_pad="5"
+ right="-115"
+ top_delta="0"
+ width="90" />
+ <button
+ follows="right|bottom"
+ height="22"
+ label="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ right="-20"
+ top_delta="0"
+ width="90" />
+</floater>
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 ffbb6aa28b..d714cc613e 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -8,6 +8,7 @@
layout="topleft"
name="outgoing call"
help_topic="outgoing_call"
+ sound_flags="0"
save_dock_state="true"
title="CALLING"
width="410">
diff --git a/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml
index 52d03cc432..00d70556b4 100644
--- a/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml
+++ b/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml
@@ -290,7 +290,7 @@
layout="topleft"
left="0"
height="67"
- width="1010">
+ width="1070">
<text
name="linksets_actions_label"
height="13"
diff --git a/indra/newview/skins/default/xui/en/floater_pay.xml b/indra/newview/skins/default/xui/en/floater_pay.xml
index 9d91f801a6..3e3f8b49ce 100644
--- a/indra/newview/skins/default/xui/en/floater_pay.xml
+++ b/indra/newview/skins/default/xui/en/floater_pay.xml
@@ -2,7 +2,7 @@
<floater
legacy_header_height="18"
can_minimize="false"
- height="186"
+ height="208"
layout="topleft"
name="Give Money"
help_topic="give_money"
@@ -43,6 +43,26 @@
width="180">
Test Name That Is Extremely Long To Check Clipping
</text>
+ <text
+ type="string"
+ follows="top|left"
+ height="18"
+ left="10"
+ name="payment_message_label"
+ top_pad="6"
+ width="120">
+ Description (optional):
+ </text>
+ <line_editor
+ border_style="line"
+ follows="left|top|right"
+ height="19"
+ top_delta="-2"
+ layout="topleft"
+ max_length_bytes="127"
+ name="payment_message"
+ right="-11"
+ width="109" />
<panel
border_thickness="0"
height="104"
@@ -125,7 +145,7 @@
top_pad="0"
max_length_bytes="9"
name="amount"
- width="90" />
+ right="-1" />
<button
enabled="false"
height="23"
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index 9a9101e0da..5ca527ad20 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -120,6 +120,13 @@
layout="topleft"
help_topic="preferences_advanced1_tab"
name="advanced1" />
+ <panel
+ class="panel_preference"
+ filename="panel_preferences_uploads.xml"
+ label="Uploads"
+ layout="topleft"
+ help_topic="preferences_uploads_tab"
+ name="uploads" />
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml b/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml
index 71ff961c59..62cce3a1e3 100644
--- a/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml
+++ b/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml
@@ -7,29 +7,23 @@
save_rect="true"
save_visibility="true"
title="SCENE LOAD STATISTICS"
- width="260">
- <button follows="top|left"
- top="20"
- bottom="60"
- left="10"
- width="100"
- label="Pause"
- name="playpause"/>
+ min_width="250"
+ width="400">
<scroll_container follows="top|left|bottom|right"
bottom="400"
layout="topleft"
left="0"
name="statistics_scroll"
reserve_scroll_corner="true"
- top="60"
- width="260">
+ top="20"
+ width="395">
<container_view follows="top|left|bottom|right"
height="378"
layout="topleft"
left="2"
name="statistics_view"
top="20"
- width="245" >
+ width="380" >
<!--Basic Section-->
<stat_view name="basic"
label="Basic"
diff --git a/indra/newview/skins/default/xui/en/floater_script_limits.xml b/indra/newview/skins/default/xui/en/floater_script_limits.xml
index 6b36cdfcc5..96b2ceec63 100644
--- a/indra/newview/skins/default/xui/en/floater_script_limits.xml
+++ b/indra/newview/skins/default/xui/en/floater_script_limits.xml
@@ -8,7 +8,8 @@
name="scriptlimits"
save_rect="true"
title="SCRIPT INFORMATION"
- width="480">
+ min_width="620"
+ width="620">
<tab_container
bottom="555"
follows="left|right|top|bottom"
diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml
index 90f9591f29..e4f735740b 100644
--- a/indra/newview/skins/default/xui/en/floater_stats.xml
+++ b/indra/newview/skins/default/xui/en/floater_stats.xml
@@ -8,7 +8,8 @@
save_rect="true"
save_visibility="true"
title="STATISTICS"
- width="260">
+ min_width="250"
+ width="270">
<scroll_container follows="all"
height="380"
layout="topleft"
@@ -16,14 +17,14 @@
name="statistics_scroll"
reserve_scroll_corner="true"
top="20"
- width="260">
+ width="265">
<container_view follows="all"
height="378"
layout="topleft"
- left="2"
+ left="0"
name="statistics_view"
top="20"
- width="245" >
+ width="250" >
<stat_view name="basic"
label="Basic"
setting="OpenDebugStatBasic">
diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
index 6021ba0a5a..53618b684b 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -85,8 +85,7 @@
layout="topleft"
left_delta="-12"
name="unknown"
- top_pad="4"
- width="">
+ top_pad="4">
Size: [DIMENSIONS]
</text>
@@ -219,7 +218,6 @@
height="260"
follows="left|top|right|bottom"
column_padding="0"
- can_resize="false"
draw_heading="true"
multi_select="true"
search_column="1"
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 3c28233875..91e4c1b603 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -1104,7 +1104,6 @@ even though the user gets a free copy.
name="Edit Cost"
label="L$"
label_width="15"
- label_text.valign="center"
valign="center"
width="85"
min_val="0"
diff --git a/indra/newview/skins/default/xui/en/floater_twitter.xml b/indra/newview/skins/default/xui/en/floater_twitter.xml
index 3e1a91e58d..5e8dfb8a52 100644
--- a/indra/newview/skins/default/xui/en/floater_twitter.xml
+++ b/indra/newview/skins/default/xui/en/floater_twitter.xml
@@ -20,8 +20,7 @@
tab_position="top"
top="7"
height="457"
- halign="center"
- use_highlighting_on_hover="true">
+ halign="center">
<panel
filename="panel_twitter_photo.xml"
class="lltwitterphotopanel"
diff --git a/indra/newview/skins/default/xui/en/menu_gesture_gear.xml b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml
index b08d21e8f4..c1458977ca 100644
--- a/indra/newview/skins/default/xui/en/menu_gesture_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml
@@ -5,8 +5,7 @@
name="menu_gesture_gear"
visible="false">
<menu_item_call
- font="SansSerifBold"
- label="Add/Remove from Favorites"
+ label="Activate/Deactivate selected gesture"
layout="topleft"
name="activate">
<on_click
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index 61002bf1b5..e1f9269c70 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -322,6 +322,43 @@
</menu_item_call>
</menu>
<menu
+ label="Use as default for"
+ layout="topleft"
+ name="upload_def">
+ <menu_item_call
+ label="Image uploads"
+ layout="topleft"
+ name="Image uploads">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="texture" />
+ </menu_item_call>
+ <menu_item_call
+ label="Sound uploads"
+ layout="topleft"
+ name="Sound uploads">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="sound" />
+ </menu_item_call>
+ <menu_item_call
+ label="Animation uploads"
+ layout="topleft"
+ name="Animation uploads">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="animation" />
+ </menu_item_call>
+ <menu_item_call
+ label="Model uploads"
+ layout="topleft"
+ name="Model uploads">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="model" />
+ </menu_item_call>
+ </menu>
+ <menu
label="Change Type"
layout="topleft"
name="Change Type">
@@ -457,6 +494,14 @@
function="Inventory.DoToSelected"
parameter="removefromoutfit" />
</menu_item_call>
+ <menu_item_call
+ label="Copy outfit list to clipboard"
+ layout="topleft"
+ name="Copy outfit list to clipboard">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="copyoutfittoclipboard" />
+ </menu_item_call>
<menu_item_separator
layout="topleft"
name="Outfit Separator" />
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
index 06d0b849a3..61cc9dfe77 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
@@ -95,6 +95,9 @@
<on_click
function="Inventory.GearDefault.Custom.Action"
parameter="empty_lostnfound" />
+ <on_enable
+ function="Inventory.GearDefault.Enable"
+ parameter="empty_lostnfound" />
</menu_item_call>
<menu_item_separator
layout="topleft" />
@@ -152,5 +155,8 @@
<on_click
function="Inventory.GearDefault.Custom.Action"
parameter="empty_trash" />
+ <on_enable
+ function="Inventory.GearDefault.Enable"
+ parameter="empty_trash" />
</menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index a39ee5fddd..8cd0c415f4 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -20,6 +20,18 @@
function="Floater.Toggle"
parameter="preferences" />
</menu_item_call>
+ <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_separator />
<menu_item_call
label="Exit [APP_NAME]"
@@ -287,18 +299,6 @@
parameter="4" />
</menu_item_check>
</menu>
- <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"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index ea826d2243..7c128d1523 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -447,8 +447,15 @@
function="Floater.Toggle"
parameter="mini_map" />
</menu_item_check>
+ <menu_item_call
+ label="Events"
+ name="Events">
+ <menu_item_call.on_click
+ function="Advanced.ShowURL"
+ parameter="http://events.secondlife.com"/>
+ </menu_item_call>
<menu_item_check
- label="Search"
+ label="Search..."
name="Search"
shortcut="control|F">
<menu_item_check.on_check
@@ -885,12 +892,12 @@
</menu_item_check>
<menu
create_jump_keys="true"
- label="Select Linked Parts"
- name="Select Linked Parts"
+ label="Select Elements"
+ name="Select Elements"
tear_off="true">
<menu_item_call
- label="Select Next Part"
- name="Select Next Part"
+ label="Select Next Part or Face"
+ name="Select Next Part or Face"
shortcut="control|.">
<menu_item_call.on_click
function="Tools.SelectNextPart"
@@ -899,8 +906,8 @@
function="Tools.EnableSelectNextPart" />
</menu_item_call>
<menu_item_call
- label="Select Previous Part"
- name="Select Previous Part"
+ label="Select Previous Part or Face"
+ name="Select Previous Part or Face"
shortcut="control|,">
<menu_item_call.on_click
function="Tools.SelectNextPart"
@@ -909,8 +916,8 @@
function="Tools.EnableSelectNextPart" />
</menu_item_call>
<menu_item_call
- label="Include Next Part"
- name="Include Next Part"
+ label="Include Next Part or Face"
+ name="Include Next Part or Face"
shortcut="control|shift|.">
<menu_item_call.on_click
function="Tools.SelectNextPart"
@@ -919,8 +926,8 @@
function="Tools.EnableSelectNextPart" />
</menu_item_call>
<menu_item_call
- label="Include Previous Part"
- name="Include Previous Part"
+ label="Include Previous Part or Face"
+ name="Include Previous Part or Face"
shortcut="control|shift|,">
<menu_item_call.on_click
function="Tools.SelectNextPart"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 11e019e153..58869ec602 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -1498,7 +1498,20 @@ Delete Notecard?
notext="Cancel"
yestext="OK"/>
</notification>
-
+
+ <notification
+ icon="alertmodal.tga"
+ name="LoadPreviousReportScreenshot"
+ type="alertmodal">
+ <unique/>
+Do you want to use previous screenshot for your report?
+ <tag>confirm</tag>
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
<notification
icon="alertmodal.tga"
name="GestureSaveFailedTooManySteps"
@@ -1880,7 +1893,16 @@ Go to [_URL] for information on purchasing L$?
notext="Cancel"
yestext="OK"/>
</notification>
-
+
+ <notification
+ icon="alertmodal.tga"
+ name="MuteLimitReached"
+ persist="false"
+ type="notify">
+Unable to add new entry to block list because you reached the limit of [MUTE_LIMIT] entries.
+ <tag>fail</tag>
+ </notification>
+
<notification
icon="alertmodal.tga"
name="UnableToLinkObjects"
@@ -4009,7 +4031,7 @@ An update was downloaded. It will be installed during restart.
icon="alertmodal.tga"
name="UpdateCheckError"
type="alertmodal">
-An error occured while checking for update.
+An error occurred while checking for update.
Please try again later.
<tag>confirm</tag>
<usetemplate
@@ -6149,6 +6171,7 @@ Link to this from a web page to give others easy access to this location, or try
icon="alertmodal.tga"
name="WLSavePresetAlert"
type="alertmodal">
+ <unique/>
Do you wish to overwrite the saved preset?
<tag>confirm</tag>
<usetemplate
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index ded814bbeb..3a34bcbe21 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -15,7 +15,6 @@
<layout_stack
follows="left|right|top"
height="172"
- min_height="172"
left="0"
name="ui_stack"
orientation="horizontal"
@@ -50,7 +49,7 @@
label="Username"
combo_editor.font="SansSerifLarge"
max_chars="128"
- commit_on_focus_lost="false"
+ combo_editor.commit_on_focus_lost="false"
combo_editor.prevalidate_callback="ascii"
tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine"
name="username_combo"
@@ -107,7 +106,7 @@
follows="left|top"
image_unselected="PushButton_Login"
image_pressed="PushButton_Login_Pressed"
- image_hover="PushButton_Login_Over"
+ image_hover_unselected="PushButton_Login_Over"
label="Log In"
label_color="White"
font="SansSerifMedium"
diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml
index 756b8f8102..4d9316768b 100644
--- a/indra/newview/skins/default/xui/en/panel_notification.xml
+++ b/indra/newview/skins/default/xui/en/panel_notification.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
background_opaque="false"
- border_visible="false"
+ border_visible="false"
background_visible="true"
bg_alpha_color="PanelNotificationBackground"
bg_opaque_color="PanelNotificationBackground"
@@ -11,16 +11,16 @@
name="notification_panel"
chrome="true"
top="0"
- height="140"
+ height="140"
translate="false"
width="305">
<!-- THIS PANEL CONTROLS TOAST HEIGHT? -->
<panel
- border_visible="false"
- bevel_style="none"
+ border_visible="false"
+ bevel_style="none"
background_visible="true"
- bg_alpha_color="ToastBackground"
- bg_opaque_color="ToastBackground"
+ bg_alpha_color="ToastBackground"
+ bg_opaque_color="ToastBackground"
follows="left|right|top"
height="100"
label="info_panel"
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml b/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml
index c1272c6bf8..e3790ae09b 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml
@@ -34,12 +34,9 @@
Searching...
</text>
<scroll_container
- border="true"
- bevel_style="none"
follows="all"
height="400"
width="312"
- min_width="312"
layout="topleft"
left="4"
top="0"
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 ff0714adbb..eeb930485e 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -26,10 +26,11 @@
layout="topleft"
left="5"
name="appearance_tabs"
- tab_min_width="150"
+ tab_min_width="100"
tab_height="30"
tab_position="top"
halign="center"
+ hide_scroll_arrows="true"
top="8"
width="315">
<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 0deb1d03cf..0cd56af6d7 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -157,7 +157,6 @@
enabled_control="ShowScriptErrors"
control_name="ShowScriptErrorsLocation"
follows="top|left"
- draw_border="false"
height="16"
layout="topleft"
left_delta="50"
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 c20f9b2c51..71e4009571 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -140,7 +140,6 @@
<radio_group
control_name="PreferredBrowserBehavior"
- draw_border="false"
follows="left|top"
height="60"
layout="topleft"
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 53b74fa645..8f2e81b9f7 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -394,7 +394,6 @@
<radio_group
enabled_control="EnableVoiceChat"
control_name="VoiceEarLocation"
- draw_border="false"
follows="left|top"
layout="topleft"
left_delta="-168"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_uploads.xml b/indra/newview/skins/default/xui/en/panel_preferences_uploads.xml
new file mode 100644
index 0000000000..487da54fdf
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_preferences_uploads.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<panel
+ border="true"
+ follows="all"
+ height="408"
+ label="Uploads"
+ layout="topleft"
+ left="102"
+ name="uploads"
+ top="1"
+ width="517">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ left="33"
+ name="title"
+ top_pad="10"
+ width="250">
+ Current destination folders for uploads
+ </text>
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ left="37"
+ name="title_models"
+ top_pad="17"
+ width="100">
+ Images
+ </text>
+ <text
+ type="string"
+ use_ellipses="true"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ font.style="BOLD"
+ left="37"
+ name="upload_textures"
+ top_pad="5"
+ width="350" />
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ left="37"
+ name="title_sounds"
+ top_pad="7"
+ width="100">
+ Sounds
+ </text>
+ <text
+ type="string"
+ use_ellipses="true"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ font.style="BOLD"
+ left="37"
+ name="upload_sounds"
+ top_pad="5"
+ width="350" />
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ left="37"
+ name="title_animation"
+ top_pad="7"
+ width="100">
+ Animations
+ </text>
+ <text
+ type="string"
+ use_ellipses="true"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ font.style="BOLD"
+ left="37"
+ name="upload_animation"
+ top_pad="5"
+ width="350" />
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ left="37"
+ name="title_animation"
+ top_pad="7"
+ width="100">
+ Models
+ </text>
+ <text
+ type="string"
+ use_ellipses="true"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ font.style="BOLD"
+ left="37"
+ name="upload_models"
+ top_pad="5"
+ width="350" />
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="30"
+ layout="topleft"
+ font.style="ITALIC"
+ left="33"
+ name="upload_help"
+ top_pad="6"
+ width="387">
+ To change a destination folder, right click on it in inventory and choose
+ "Use as default for"
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml
index 489d286e67..898e92e030 100644
--- a/indra/newview/skins/default/xui/en/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general.xml
@@ -51,7 +51,7 @@
left_delta="50"
name="version_channel_text"
top_delta="0"
- width="200">
+ width="225">
unknown
</text>
<text
@@ -73,7 +73,7 @@
left_delta="50"
name="region_type"
top_delta="0"
- width="200">
+ width="225">
unknown
</text>
<check_box
diff --git a/indra/newview/skins/default/xui/en/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/en/panel_script_limits_my_avatar.xml
index 629d8567d1..2c2803a503 100644
--- a/indra/newview/skins/default/xui/en/panel_script_limits_my_avatar.xml
+++ b/indra/newview/skins/default/xui/en/panel_script_limits_my_avatar.xml
@@ -8,7 +8,7 @@
left="0"
name="script_limits_my_avatar_panel"
top="0"
- width="480">
+ width="620">
<text
type="string"
length="1"
@@ -19,7 +19,7 @@
name="script_memory"
top_pad="24"
text_color="White"
- width="480">
+ width="620">
Avatar Script Usage
</text>
<text
@@ -31,7 +31,7 @@
left="30"
name="memory_used"
top_delta="18"
- width="480">
+ width="620">
</text>
<text
@@ -43,7 +43,7 @@
left="30"
name="urls_used"
top_delta="18"
- width="480">
+ width="620">
</text>
<text
@@ -56,7 +56,7 @@
name="loading_text"
top="80"
text_color="EmphasisColor"
- width="480">
+ width="620">
Loading...
</text>
<scroll_list
@@ -68,7 +68,7 @@
multi_select="true"
name="scripts_list"
top="100"
- width="460">
+ width="600">
<scroll_list.columns
label="Size (kb)"
name="size"
diff --git a/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml
index c5e8bf5803..79bb781bc6 100644
--- a/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml
+++ b/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml
@@ -8,7 +8,7 @@
name="script_limits_region_memory_panel"
top="0"
left="0"
- width="480">
+ width="620">
<text
type="string"
length="1"
@@ -19,7 +19,7 @@
name="script_memory"
top_pad="24"
text_color="White"
- width="480">
+ width="620">
Parcel Script Memory
</text>
<text
@@ -32,7 +32,7 @@
name="parcels_listed"
top_delta="18"
visible="true"
- width="480">
+ width="620">
</text>
<text
@@ -44,7 +44,7 @@
left="30"
name="memory_used"
top_delta="18"
- width="480">
+ width="620">
</text>
<text
@@ -56,7 +56,7 @@
left="30"
name="urls_used"
top_delta="18"
- width="480">
+ width="620">
</text>
<text
@@ -69,7 +69,7 @@
name="loading_text"
top_delta="12"
text_color="EmphasisColor"
- width="480">
+ width="620">
Loading...
</text>
<scroll_list
@@ -83,7 +83,7 @@
sort_ascending="true"
name="scripts_list"
top_delta="16"
- width="460">
+ width="600">
<scroll_list.columns
label="Size (kb)"
name="size"
@@ -120,23 +120,23 @@
left="10"
width="100" />
<button
- follows="bottom|right"
+ follows="bottom|left"
height="19"
- label="Highlight"
+ label="Return"
visible="false"
- layout="bottomright"
- left="370"
- name="highlight_btn"
+ layout="bottomleft"
+ name="return_btn"
top="34"
+ left_delta="390"
width="100" />
<button
- follows="bottom|right"
+ follows="bottom|left"
height="19"
- label="Return"
+ label="Highlight"
visible="false"
- layout="bottomright"
- name="return_btn"
+ layout="bottomleft"
+ left_delta="105"
+ name="highlight_btn"
top="34"
- left_delta="-105"
width="100" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml
index 975b08be05..8e92552921 100644
--- a/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml
@@ -61,8 +61,7 @@
right="-2"
height="319"
follows="all"
- halign="center"
- use_highlighting_on_hover="true">
+ halign="center">
<panel
follows="all"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index d3e24a19ef..9995523e61 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -59,7 +59,6 @@
name="inbox_layout_panel"
visible="false"
min_dim="35"
- max_dim="235"
expanded_min_dim="90"
height="235">
<panel
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index dcb259f2bb..b75f631799 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -45,9 +45,20 @@ Graphics Card Vendor: [GRAPHICS_CARD_VENDOR]
Graphics Card: [GRAPHICS_CARD]
</string>
<string name="AboutDriver">Windows Graphics Driver Version: [GRAPHICS_DRIVER_VERSION]</string>
+ <string name="AboutOGL">OpenGL Version: [OPENGL_VERSION]</string>
+ <string name="AboutSettings">
+Window size: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
+Font Size Adjustment: [FONT_SIZE_ADJUSTMENT]pt
+UI Scaling: [UI_SCALE]
+Draw distance: [DRAW_DISTANCE]m
+Bandwidth: [NET_BANDWITH]kbit/s
+LOD factor: [LOD_FACTOR]
+Render quality: [RENDER_QUALITY] / 7
+Advanced Lighting Model: [GPU_SHADERS]
+Texture memory: [TEXTURE_MEMORY]MB
+VFS (cache) creation time: [VFS_TIME]
+ </string>
<string name="AboutLibs">
-OpenGL Version: [OPENGL_VERSION]
-
J2C Decoder Version: [J2C_VERSION]
Audio Driver Version: [AUDIO_DRIVER_VERSION]
LLCEFLib/CEF Version: [LLCEFLIB_VERSION]
@@ -3729,12 +3740,15 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<!-- Financial operations strings -->
<string name="paid_you_ldollars">[NAME] paid you L$[AMOUNT] [REASON].</string>
+ <string name="paid_you_ldollars_gift">[NAME] paid you L$[AMOUNT]: [REASON]</string>
<string name="paid_you_ldollars_no_reason">[NAME] paid you L$[AMOUNT].</string>
<string name="you_paid_ldollars">You paid [NAME] L$[AMOUNT] [REASON].</string>
+ <string name="you_paid_ldollars_gift">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="you_paid_failure_ldollars">You failed to pay [NAME] L$[AMOUNT] [REASON].</string>
+ <string name="you_paid_failure_ldollars_gift">You failed to pay [NAME] L$[AMOUNT]: [REASON]</string>
<string name="you_paid_failure_ldollars_no_info">You failed to pay L$[AMOUNT].</string>
<string name="you_paid_failure_ldollars_no_reason">You failed to pay [NAME] L$[AMOUNT].</string>
<string name="you_paid_failure_ldollars_no_name">You failed to pay L$[AMOUNT] [REASON].</string>
@@ -3801,7 +3815,7 @@ Abuse Report</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 - Stick tougue out">Male - Stick tongue out</string>
<string name="Male - Wow">Male - Wow</string>
<string name="Female - Chuckle">Female - Chuckle</string>
@@ -3820,7 +3834,7 @@ Abuse Report</string>
<string name="Female - Please">Female - Please</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 - Stick tougue out">Female - Stick tongue out</string>
<string name="Female - Wow">Female - Wow</string>
<string name="/bow">/bow</string>
@@ -4069,6 +4083,7 @@ Try enclosing path to the editor with double quotes.
<string name="Command_Places_Label">Places</string>
<string name="Command_Preferences_Label">Preferences</string>
<string name="Command_Profile_Label">Profile</string>
+ <string name="Command_Report_Abuse_Label">Report Abuse</string>
<string name="Command_Search_Label">Search</string>
<string name="Command_Snapshot_Label">Snapshot</string>
<string name="Command_Speak_Label">Speak</string>
@@ -4100,6 +4115,7 @@ Try enclosing path to the editor with double quotes.
<string name="Command_Places_Tooltip">Places you've saved</string>
<string name="Command_Preferences_Tooltip">Preferences</string>
<string name="Command_Profile_Tooltip">Edit or view your profile</string>
+ <string name="Command_Report_Abuse_Tooltip">Report Abuse</string>
<string name="Command_Search_Tooltip">Find places, events, people</string>
<string name="Command_Snapshot_Tooltip">Take a picture</string>
<string name="Command_Speak_Tooltip">Speak with people nearby using your microphone</string>
@@ -4184,6 +4200,9 @@ Try enclosing path to the editor with double quotes.
Loading...
</string>
+ <!-- Statistics -->
+ <string name="na">n/a</string>
+
<!-- Presets graphic/camera -->
<string name="preset_combo_label">-Empty list-</string>
<string name="Default">Default</string>
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 61ec046649..674be59753 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -133,7 +133,7 @@
name="damage_text"
width="35"
height="18"
- top="17"
+ top="18"
follows="right|top"
halign="right"
font="SansSerifSmall"
diff --git a/indra/newview/skins/default/xui/en/widgets/slider.xml b/indra/newview/skins/default/xui/en/widgets/slider.xml
index f735d09476..6cceafc9ae 100644
--- a/indra/newview/skins/default/xui/en/widgets/slider.xml
+++ b/indra/newview/skins/default/xui/en/widgets/slider.xml
@@ -8,7 +8,6 @@
text_color="LabelTextColor"
text_disabled_color="LabelDisabledColor">
<slider.value_editor name="slider editor"
- max_length="10"
follows="left|bottom"/>
<slider.value_text name="slider text"
follows="left|bottom"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/texture_picker.xml b/indra/newview/skins/default/xui/en/widgets/texture_picker.xml
index ba2fdf4f1f..1511116ba6 100644
--- a/indra/newview/skins/default/xui/en/widgets/texture_picker.xml
+++ b/indra/newview/skins/default/xui/en/widgets/texture_picker.xml
@@ -5,8 +5,7 @@
follows="left|top"
>
<multiselect_text font="SansSerifSmall"/>
- <caption_text text="Multiple"
- halign="center"
+ <caption_text halign="center"
font="SansSerifSmall"
v_pad="2"/>
<border bevel_style="in"/>
diff --git a/indra/newview/skins/default/xui/es/floater_model_preview.xml b/indra/newview/skins/default/xui/es/floater_model_preview.xml
index a5229cd48c..a269add08a 100644
--- a/indra/newview/skins/default/xui/es/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/es/floater_model_preview.xml
@@ -245,6 +245,7 @@
</text>
<check_box label="Incluir el peso de la piel" name="upload_skin"/>
<check_box label="Incluir posturas de las articulaciones" name="upload_joints"/>
+ <check_box label="Bloquear la escala si está definida la posición de la articulación" name="lock_scale_if_joint_position"/>
<text name="pelvis_offset_label">
Desplazamiento Z (subir o bajar el avatar):
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_pay.xml b/indra/newview/skins/default/xui/es/floater_pay.xml
index 567f980446..61a898adad 100644
--- a/indra/newview/skins/default/xui/es/floater_pay.xml
+++ b/indra/newview/skins/default/xui/es/floater_pay.xml
@@ -1,9 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string name="payee_group">Pagar al grupo</string>
- <string name="payee_resident">Pagar al residente</string>
- <text name="paying_text">Vas a pagar:</text>
- <text left="115" name="payee_name">Nombre de prueba demasiado largo para comprobar la función de recorte</text>
+ <string name="payee_group">
+ Pagar al grupo
+ </string>
+ <string name="payee_resident">
+ Pagar al residente
+ </string>
+ <text name="paying_text">
+ Vas a pagar:
+ </text>
+ <text left="115" name="payee_name">
+ Nombre de prueba demasiado largo para comprobar la función de recorte
+ </text>
+ <text name="payment_message_label">
+ Descripción (opcional):
+ </text>
<panel label="Buscar" name="PatternsPanel">
<button label="Pagar 1 L$" label_selected="Pagar 1 L$" name="fastpay 1"/>
<button label="Pagar 5 L$" label_selected="Pagar 5 L$" name="fastpay 5"/>
@@ -11,7 +22,9 @@
<button label="Pagar 20 L$" label_selected="Pagar 20 L$" name="fastpay 20"/>
</panel>
<panel label="Buscar" name="InputPanel">
- <text name="amount text">Otra cantidad:</text>
+ <text name="amount text">
+ Otra cantidad:
+ </text>
<button label="Pagar" label_selected="Pagar" name="pay btn"/>
<button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/floater_script_queue.xml b/indra/newview/skins/default/xui/es/floater_script_queue.xml
index 39c84103c4..2dbc59e903 100644
--- a/indra/newview/skins/default/xui/es/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/es/floater_script_queue.xml
@@ -15,5 +15,11 @@
<floater.string name="NotRunning">
Sin ejecutarse
</floater.string>
+ <floater.string name="Timeout">
+ Tiempo de espera: [OBJECT_NAME]
+ </floater.string>
+ <floater.string name="LoadingObjInv">
+ Cargando inventario de: [OBJECT_NAME]
+ </floater.string>
<button label="Cerrar" label_selected="Cerrar" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_web_content.xml b/indra/newview/skins/default/xui/es/floater_web_content.xml
index 5e02fad2dd..3f3e2bb01e 100644
--- a/indra/newview/skins/default/xui/es/floater_web_content.xml
+++ b/indra/newview/skins/default/xui/es/floater_web_content.xml
@@ -10,5 +10,9 @@
<icon name="media_secure_lock_flag" tool_tip="Navegación segura"/>
<button name="popexternal" tool_tip="Abrir URL actual en tu navegador de escritorio"/>
</layout_panel>
+ <layout_panel name="debug_controls">
+ <button name="web_test_home_page" tool_tip="Página principal de pruebas web"/>
+ <button name="VLC Plugin Test" tool_tip="Prueba de vídeo MPEG4"/>
+ </layout_panel>
</layout_stack>
</floater>
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 c92583cfc3..f1394dad05 100644
--- a/indra/newview/skins/default/xui/es/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/es/menu_attachment_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="Llamada" name="Call"/>
<menu_item_call label="Invitar al grupo" name="Invite..."/>
<menu_item_call label="Restablecer esqueleto" name="Reset Skeleton"/>
+ <menu_item_call label="Restablecer esqueleto y animaciones" name="Reset Skeleton And Animations"/>
<menu_item_call label="Ignorar" name="Avatar Mute"/>
<menu_item_call label="Denunciar" name="abuse"/>
<menu_item_call label="Congelar" name="Freeze..."/>
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 a4d09a44ab..7805db3ab4 100644
--- a/indra/newview/skins/default/xui/es/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/es/menu_attachment_self.xml
@@ -10,6 +10,7 @@
<menu_item_call label="Editar mi anatomía" name="Edit My Shape"/>
<menu_item_call label="Altura del avatar" name="Hover Height"/>
<menu_item_call label="Restablecer esqueleto" name="Reset Skeleton"/>
+ <menu_item_call label="Restablecer esqueleto y animaciones" name="Reset Skeleton And Animations"/>
<menu_item_call label="Mis amigos" name="Friends..."/>
<menu_item_call label="Mis grupos" name="Groups..."/>
<menu_item_call label="Mi perfil" name="Profile..."/>
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 e5aef03911..80f16d3e82 100644
--- a/indra/newview/skins/default/xui/es/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/es/menu_avatar_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="Llamada" name="Call"/>
<menu_item_call label="Invitar al grupo" name="Invite..."/>
<menu_item_call label="Restablecer esqueleto" name="Reset Skeleton"/>
+ <menu_item_call label="Restablecer esqueleto y animaciones" name="Reset Skeleton And Animations"/>
<menu_item_call label="Ignorar" name="Avatar Mute"/>
<menu_item_call label="Denunciar" name="abuse"/>
<menu_item_call label="Congelar" name="Freeze..."/>
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 ab14966217..bdb4771d17 100644
--- a/indra/newview/skins/default/xui/es/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/es/menu_avatar_self.xml
@@ -27,6 +27,7 @@
<menu_item_call label="Editar mi anatomía" name="Edit My Shape"/>
<menu_item_call label="Altura del avatar" name="Hover Height"/>
<menu_item_call label="Restablecer esqueleto" name="Reset Skeleton"/>
+ <menu_item_call label="Restablecer esqueleto y animaciones" name="Reset Skeleton And Animations"/>
<menu_item_call label="Mis amigos" name="Friends..."/>
<menu_item_call label="Mis grupos" name="Groups..."/>
<menu_item_call label="Mi perfil" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/es/menu_login.xml b/indra/newview/skins/default/xui/es/menu_login.xml
index 44e8f3ffeb..d9f8f23576 100644
--- a/indra/newview/skins/default/xui/es/menu_login.xml
+++ b/indra/newview/skins/default/xui/es/menu_login.xml
@@ -20,12 +20,11 @@
<menu_item_check label="Mostrar el menú &apos;Debug&apos;" name="Show Debug Menu"/>
<menu label="Depurar" name="Debug">
<menu_item_call label="Mostrar las configuraciones del depurador" name="Debug Settings"/>
- <menu_item_call label="Configuraciones del Visor/Color" name="UI/Color Settings"/>
<menu label="Pruebas de la interfaz" name="UI Tests"/>
<menu_item_call label="Definir el tamaño de la ventana..." name="Set Window Size..."/>
<menu_item_call label="Mostrar los &apos;TOS&apos;" name="TOS"/>
<menu_item_call label="Mostrar mensaje crítico" name="Critical"/>
- <menu_item_call label="Prueba de depuración de ventanas de contenido web" name="Web Content Floater Debug Test"/>
+ <menu_item_call label="Navegador de medios" name="Media Browser"/>
<menu label="Configurar el nivel de registro" name="Set Logging Level">
<menu_item_check label="Depurar" name="Debug"/>
<menu_item_check label="Información" name="Info"/>
diff --git a/indra/newview/skins/default/xui/es/menu_object_icon.xml b/indra/newview/skins/default/xui/es/menu_object_icon.xml
index a99c889bb0..f80eb4db74 100644
--- a/indra/newview/skins/default/xui/es/menu_object_icon.xml
+++ b/indra/newview/skins/default/xui/es/menu_object_icon.xml
@@ -2,6 +2,7 @@
<menu name="Object Icon Menu">
<menu_item_call label="Perfil del objeto..." name="Object Profile"/>
<menu_item_call label="Ignorar..." name="Block"/>
+ <menu_item_call label="No ignorar" name="Unblock"/>
<menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
<menu_item_call label="Teleportarse a la posición del objeto" name="teleport_to_object"/>
</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_outfit_gear.xml b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml
index 56e64c729f..b3f2b789d7 100644
--- a/indra/newview/skins/default/xui/es/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml
@@ -3,6 +3,10 @@
<menu_item_call label="Ponerme - Reemplazar el vestuario actual" name="wear"/>
<menu_item_call label="Ponerme - Añadir al vestuario actual" name="wear_add"/>
<menu_item_call label="Quitarme - Quitar del vestuario actual" name="take_off"/>
+ <menu_item_call label="Subir una foto (10 L$)" name="upload_photo"/>
+ <menu_item_call label="Seleccionar foto" name="select_photo"/>
+ <menu_item_call label="Hacer una foto" name="take_snapshot"/>
+ <menu_item_call label="Quitar foto" name="remove_photo"/>
<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"/>
@@ -27,4 +31,5 @@
<menu_item_call label="Cerrar todas las carpetas" name="collapse"/>
<menu_item_call label="Renombrar el vestuario" name="rename"/>
<menu_item_call label="Borrar el vestuario" name="delete_outfit"/>
+ <menu_item_check label="Ordenar las carpetas siempre alfabéticamente" name="sort_folders_by_name"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_friends_view.xml b/indra/newview/skins/default/xui/es/menu_people_friends_view.xml
index ad896c1b74..75a5aa3cad 100644
--- a/indra/newview/skins/default/xui/es/menu_people_friends_view.xml
+++ b/indra/newview/skins/default/xui/es/menu_people_friends_view.xml
@@ -4,5 +4,6 @@
<menu_item_check label="Ordenar por estatus" name="sort_status"/>
<menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
<menu_item_check label="Ver permisos concedidos" name="view_permissions"/>
+ <menu_item_check label="Ocultar nombres de usuario" name="view_usernames"/>
<menu_item_check label="Ver el registro de conversaciones..." name="view_conversation"/>
</toggleable_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 09bb119d5a..9e9f2b8191 100644
--- a/indra/newview/skins/default/xui/es/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/es/menu_people_nearby.xml
@@ -13,4 +13,6 @@
<menu_item_call label="Compartir" name="share"/>
<menu_item_call label="Pagar" name="pay"/>
<menu_item_check label="Ignorar / No ignorar" name="block_unblock"/>
+ <menu_item_call label="Congelar" name="freeze"/>
+ <menu_item_call label="Expulsar" name="eject"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/es/menu_people_nearby_view.xml
index c2fb360dd1..c51047f04a 100644
--- a/indra/newview/skins/default/xui/es/menu_people_nearby_view.xml
+++ b/indra/newview/skins/default/xui/es/menu_people_nearby_view.xml
@@ -5,4 +5,5 @@
<menu_item_check label="Ordenar según distancia" name="sort_distance"/>
<menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
<menu_item_check label="Ver mapa" name="view_map"/>
+ <menu_item_check label="Ocultar nombres de usuario" name="view_usernames"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_objectim.xml b/indra/newview/skins/default/xui/es/menu_url_objectim.xml
index c3c8439ea2..51803e93c5 100644
--- a/indra/newview/skins/default/xui/es/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/es/menu_url_objectim.xml
@@ -2,6 +2,7 @@
<context_menu name="Url Popup">
<menu_item_call label="Perfil del objeto..." name="show_object"/>
<menu_item_call label="Ignorar..." name="block_object"/>
+ <menu_item_call label="Desbloquear" name="unblock_object"/>
<menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
<menu_item_call label="Teleportarse a la posición del objeto" name="teleport_to_object"/>
<menu_item_call label="Copiar el nombre del objeto al portapapeles" name="url_copy_label"/>
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index 07c358615c..c4986821f1 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -113,11 +113,11 @@
<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"/>
- <menu label="Seleccionar las partes enlazadas" name="Select Linked Parts">
- <menu_item_call label="Seleccionar la parte siguiente" name="Select Next Part"/>
- <menu_item_call label="Seleccionar la parte previa" name="Select Previous Part"/>
- <menu_item_call label="Incluir la parte siguiente" name="Include Next Part"/>
- <menu_item_call label="Incluir la parte previa" name="Include Previous Part"/>
+ <menu label="Seleccionar elementos" name="Select Elements">
+ <menu_item_call label="Seleccionar la parte o cara siguiente" name="Select Next Part or Face"/>
+ <menu_item_call label="Seleccionar la parte o cara anterior" name="Select Previous Part or Face"/>
+ <menu_item_call label="Incluir la parte o cara siguiente" name="Include Next Part or Face"/>
+ <menu_item_call label="Incluir la parte o cara anterior" name="Include Previous Part or Face"/>
</menu>
<menu_item_call label="Linksets..." name="pathfinding_linkset_menu_item"/>
<menu_item_call label="Visión en lo seleccionado" name="Focus on Selection"/>
@@ -332,8 +332,7 @@
<menu_item_call label="Volcar la caché de objetos de la región" name="Dump Region Object Cache"/>
</menu>
<menu label="UI" name="UI">
- <menu_item_call label="Prueba de navegadores de medios" name="Web Browser Test"/>
- <menu_item_call label="Navegador de contenido web" name="Web Content Browser"/>
+ <menu_item_call label="Navegador de medios" name="Media Browser"/>
<menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/>
<menu_item_check label="Debug Clicks" name="Debug Clicks"/>
<menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/>
diff --git a/indra/newview/skins/default/xui/es/menu_wearing_tab.xml b/indra/newview/skins/default/xui/es/menu_wearing_tab.xml
index 64fd7ce4cf..637a14cf5b 100644
--- a/indra/newview/skins/default/xui/es/menu_wearing_tab.xml
+++ b/indra/newview/skins/default/xui/es/menu_wearing_tab.xml
@@ -3,4 +3,6 @@
<menu_item_call label="Quitarme" name="take_off"/>
<menu_item_call label="Quitar" name="detach"/>
<menu_item_call label="Editar el vestuario" name="edit"/>
+ <menu_item_call label="Editar" name="edit_item"/>
+ <menu_item_call label="Mostrar original" name="show_original"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/es/mime_types.xml b/indra/newview/skins/default/xui/es/mime_types.xml
index eb212344ce..74e447c707 100644
--- a/indra/newview/skins/default/xui/es/mime_types.xml
+++ b/indra/newview/skins/default/xui/es/mime_types.xml
@@ -22,14 +22,6 @@
Ver la película
</playtip>
</widgetset>
- <widgetset name="none">
- <label name="none_label">
- No hay contenido
- </label>
- <tooltip name="none_tooltip">
- Aquí no hay contenido multimedia
- </tooltip>
- </widgetset>
<widgetset name="image">
<label name="image_label">
Imagen
@@ -52,11 +44,24 @@
Escuchar el audio de esta localización
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ No hay contenido
+ </label>
+ <tooltip name="none_tooltip">
+ Aquí no hay contenido multimedia
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Real Time Streaming
</label>
</scheme>
+ <scheme name="libvlc">
+ <label name="libvlc_label">
+ Medios compatibles con LibVLC
+ </label>
+ </scheme>
<mimetype name="blank">
<label name="blank_label">
- Ninguno -
@@ -127,11 +132,6 @@
Macromedia Director
</label>
</mimetype>
- <mimetype name="application/x-shockwave-flash">
- <label name="application/x-shockwave-flash_label">
- Flash
- </label>
- </mimetype>
<mimetype name="audio/mid">
<label name="audio/mid_label">
Audio (MIDI)
@@ -207,6 +207,11 @@
Película (MP4)
</label>
</mimetype>
+ <mimetype name="application/octet-stream">
+ <label name="video/octet-stream">
+ Película
+ </label>
+ </mimetype>
<mimetype name="video/quicktime">
<label name="video/quicktime_label">
Película (QuickTime)
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index a67e410814..d6e686df42 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -326,6 +326,9 @@ Si no quieres que este rol siga teniendo dichas capacidades, deshabilítalas inm
Te dispones a expulsar a [COUNT] miembros del grupo.
<usetemplate ignoretext="Confirma la expulsión de varios miembros del grupo" name="okcancelignore" notext="Cancelar" yestext="Prohibir el acceso"/>
</notification>
+ <notification name="GroupBanUserOnBanlist">
+ No se ha enviado una invitación a algunos residentes porque están expulsados del grupo.
+ </notification>
<notification name="AttachmentDrop">
Vas a soltar tu anexado.
¿Estás seguro de que quieres continuar?
@@ -454,6 +457,12 @@ debes estar dentro de ella.
<notification name="ErrorEncodingSnapshot">
Error al codificar la foto.
</notification>
+ <notification name="ErrorPhotoCannotAfford">
+ Necesitas [COST] L$ para guardar una foto en el inventario. Puedes comprar L$ o bien guardar la foto en tu equipo.
+ </notification>
+ <notification name="ErrorTextureCannotAfford">
+ Necesitas [COST] L$ para guardar una textura en el inventario. Puedes comprar L$ o bien guardar la foto en tu equipo.
+ </notification>
<notification name="ErrorUploadingPostcard">
Hubo un problema al enviar la foto por la siguiente razón: [REASON]
</notification>
@@ -570,6 +579,10 @@ o hacer una puja?
¿Deseas borrar la nota?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
+ <notification name="LoadPreviousReportScreenshot">
+ ¿Deseas incluir la foto anterior en la denuncia?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Aceptar"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
Fallo al guardar el gesto.
Este gesto tiene demasiados pasos.
@@ -630,30 +643,12 @@ El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&
</url>
<usetemplate ignoretext="El hardware de mi ordenador no está admitido" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
- <notification name="IntelOldDriver">
- Probablemente ya existe un controlador más reciente para tu procesador de gráficos. La actualización del controlador de gráficos puede mejorar sustancialmente el rendimiento.
-
- ¿Deseas visitar [_URL] para comprobar si hay controladores actualizados?
- <url name="url">
- http://www.intel.com/p/es_XL/support/detect/graphics
- </url>
- <usetemplate ignoretext="Mi controlador de gráficos no está actualizado" name="okcancelignore" notext="No" yestext="Sí"/>
- </notification>
- <notification name="AMDOldDriver">
- Probablemente ya existe un controlador más reciente para tu procesador de gráficos. La actualización del controlador de gráficos puede mejorar sustancialmente el rendimiento.
-
- ¿Deseas visitar [_URL] para comprobar si hay controladores actualizados?
- <url name="url">
- http://support.amd.com/us/Pages/AMDSupportHub.aspx
- </url>
- <usetemplate ignoretext="Mi controlador de gráficos no está actualizado" name="okcancelignore" notext="No" yestext="Sí"/>
- </notification>
- <notification name="NVIDIAOldDriver">
+ <notification name="OldGPUDriver">
Probablemente ya existe un controlador más reciente para tu procesador de gráficos. La actualización del controlador de gráficos puede mejorar sustancialmente el rendimiento.
- ¿Deseas visitar [_URL] para comprobar si hay controladores actualizados?
+ ¿Deseas visitar [URL] para buscar controladores actualizados?
<url name="url">
- http://www.nvidia.com/Download/index.aspx?lang=es
+ [URL]
</url>
<usetemplate ignoretext="Mi controlador de gráficos no está actualizado" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
@@ -746,6 +741,9 @@ misma región.
</url>
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
+ <notification name="MuteLimitReached">
+ No se puede añadir una entrada nueva a la lista de bloqueados porque has alcanzado el límite de [MUTE_LIMIT] entradas.
+ </notification>
<notification name="UnableToLinkObjects">
No se pudo enlazar estos [COUNT] objetos.
Puedes enlazar [MAX] objetos como máximo.
@@ -1383,6 +1381,11 @@ Puedes usar [SECOND_LIFE] de forma normal; los demás residentes te verán corre
</notification>
<notification name="AgentComplexity">
La [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 complejidad de tu avatar] es [AGENT_COMPLEXITY].
+ <usetemplate ignoretext="Advertirme cuando cambie la complejidad de mi avatar" name="notifyignore"/>
+ </notification>
+ <notification name="HUDComplexityWarning">
+ [HUD_REASON], es probable que afecte negativamente al rendimiento.
+ <usetemplate ignoretext="Avisarme si la complejidad de mi HUD es excesiva" name="notifyignore"/>
</notification>
<notification name="FirstRun">
Se ha completado la instalación de [SECOND_LIFE].
@@ -1475,6 +1478,10 @@ Por favor, selecciona sólo uno y vuelve a intentarlo.
¿Teleportar a tu base a todos los residentes en esta región?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
+ <notification name="ChangeObjectBonusFactor">
+ Si disminuyes el plus de objetos cuando ya se han establecido construcciones en una región, algunos objetos se podrían eliminar o devolver. ¿Estás seguro de que quieres cambiar el plus de objetos?
+ <usetemplate ignoretext="Confirmar el cambio del factor de plus del objeto" name="okcancelignore" notext="Cancelar" yestext="Aceptar"/>
+ </notification>
<notification name="EstateObjectReturn">
¿Estás seguro de que quieres devolver los objetos propiedad de
[USER_NAME] ?
@@ -1523,6 +1530,9 @@ Se superan en [NUM_EXCESS] los [MAX_AGENTS] permitidos en [LIST_TYPE].
<notification name="OwnerCanNotBeDenied">
No se puede añadir a la lista de residentes no admitidos al propietario del estado.
</notification>
+ <notification name="ProblemAddingEstateManagerBanned">
+ No se puede añadir un residente expulsado a la lista de administradores de estado.
+ </notification>
<notification name="CanNotChangeAppearanceUntilLoaded">
No puedes cambiar la apariencia hasta que no se carguen la ropa y la forma.
</notification>
@@ -1697,6 +1707,10 @@ Si estás impaciente por probar las nuevas funciones y correcciones, lee la pág
¿Quieres abrir tu navegador para ver este contenido?
<usetemplate ignoretext="Abrir mi navegador para ver una página web" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
+ <notification name="SystemUIScaleFactorChanged">
+ El factor de tamaño de IU del sistema ha cambiado desde la última ejecución. ¿Deseas abrir la página de ajustes de tamaño de la IU?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Aceptar"/>
+ </notification>
<notification name="WebLaunchJoinNow">
¿Ir al [http://secondlife.com/account/ Panel de Control] para administrar tu cuenta?
<usetemplate ignoretext="Abrir mi navegador para administrar mi cuenta" name="okcancelignore" notext="Cancelar" yestext="OK"/>
@@ -1736,10 +1750,17 @@ Si estás impaciente por probar las nuevas funciones y correcciones, lee la pág
¿Deseas abandonar el grupo?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
+ <notification name="GroupDepart">
+ Has abandonado el grupo &apos;[group_name]&apos;.
+ </notification>
<notification name="OwnerCannotLeaveGroup">
No es posible abandonar el grupo. No puedes abandonarlo porque eres su último propietario. Antes tienes que asignar el papel de propietario a otro miembro.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="GroupDepartError">
+ No se puede abandonar el grupo.
+ <usetemplate name="okbutton" yestext="Aceptar"/>
+ </notification>
<notification name="ConfirmKick">
¿Quieres realmente expulsar a todos los residentes de la cuadrícula?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar a todos los Residentes"/>
@@ -2140,6 +2161,10 @@ Se cambiarán miles de regiones, y se provocará un colapso en el espacio del se
Hay demasiados prims seleccionados. Por favor, selecciona [MAX_PRIM_COUNT] o menos y vuelve a intentarlo
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="TooManyScriptsSelected">
+ Los objetos seleccionados tienen demasiados scripts. Selecciona menos objetos y repite la operación
+ <usetemplate name="okbutton" yestext="Aceptar"/>
+ </notification>
<notification name="ProblemImportingEstateCovenant">
Hay problemas al importar el contrato del estado.
<usetemplate name="okbutton" yestext="OK"/>
@@ -2308,6 +2333,10 @@ Dado que estos objetos tienen scripts, moverlos a tu inventario puede provocar u
Error en el pago: no se encuentra el objeto.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="PaymentBlockedButtonMismatch">
+ Pago suspendido: el precio pagado no coincide con ninguno de los botones de pago asociados a este objeto.
+ <usetemplate name="okbutton" yestext="Aceptar"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
En este objeto, no hay ítems que estés autorizado a copiar.
</notification>
@@ -2343,6 +2372,12 @@ Esta acción no se puede deshacer.
La selección es grande y contiene linksets. Si la desenlazas, quizás no puedas volver establecer los vínculos. Puede ser conveniente guardar copias de los linksets como medida de precaución.
<usetemplate ignoretext="Confirmar que desenlazas un linkset" name="okcancelignore" notext="Cancelar" yestext="Desenlazar"/>
</notification>
+ <notification name="HelpReportAbuseConfirm">
+ Gracias por informarnos de este asunto.
+Comprobaremos si tu denuncia contiene posibles transgresiones
+y tomaremos las medidas oportunas.
+ <usetemplate name="okbutton" yestext="Aceptar"/>
+ </notification>
<notification name="HelpReportAbuseSelectCategory">
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.
@@ -2770,6 +2805,10 @@ Aquí no puedes volar.
<notification name="PathfindingDirty">
La región contiene cambios de pathfinding pendientes. Si tienes derechos de construcción, puedes recargarla pulsando el botón “Recargar región”.
</notification>
+ <notification name="PathfindingDirtyRebake">
+ La región contiene cambios de pathfinding pendientes. Si tienes derechos de construcción, puedes recargarla pulsando el botón “Recargar región”.
+ <usetemplate name="okbutton" yestext="Recargar la región"/>
+ </notification>
<notification name="DynamicPathfindingDisabled">
Esta región no tiene activado el pathfinding dinámico. Los objetos programados que utilicen llamadas LSL de pathfinding pueden tener un comportamiento inesperado en ella.
</notification>
@@ -3269,11 +3308,13 @@ Por tu seguridad, serán bloqueadas durante unos segundos.
El aspecto se ha guardado como XML en [PATH]
</notification>
<notification name="AppearanceToXMLFailed">
- Error al guardar el aspecto como XML.
- icon=&quot;notifytip.tga&quot;
- name=&quot;PresetNotDeleted&quot;
- type=&quot;notifytip&quot;&gt;
-Error al eliminar el valor predefinido [NAME].
+ Error al guardar el aspecto en XML.
+ </notification>
+ <notification name="PresetNotSaved">
+ Error al guardar el valor predefinido [NAME].
+ </notification>
+ <notification name="PresetNotDeleted">
+ Error al eliminar el valor predefinido [NAME].
</notification>
<notification name="UnableToFindHelpTopic">
No se ha podido encontrar un tema de ayuda para este elemento.
@@ -3480,13 +3521,6 @@ Al ocultar el botón Hablar se desactiva la función de voz.
<notification name="ForceQuitDueToLowMemory">
SL saldrá en 30 segundos porque no hay memoria suficiente.
</notification>
- <notification name="PopupAttempt">
- Se ha impedido que se abriera una ventana emergente.
- <form name="form">
- <ignore name="ignore" text="Permitir todas las ventanas emergentes"/>
- <button name="open" text="Abrir ventana emergente"/>
- </form>
- </notification>
<notification name="SOCKS_NOT_PERMITTED">
El proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; ha rechazado la conexión, no está permitida por el juego de reglas.
<usetemplate name="okbutton" yestext="OK"/>
@@ -3861,6 +3895,9 @@ Prueba otra vez dentro de un minuto.
No se puede mover el objeto &apos;[OBJECT_NAME]&apos; a
[OBJ_POSITION] de la región [REGION_NAME] porque no hay suficientes recursos para este objeto en esta parcela.
</notification>
+ <notification name="NoParcelPermsNoObject">
+ Error al copiar: no tienes acceso a esa parcela.
+ </notification>
<notification name="CantMoveObjectRegionVersion">
No se puede mover el objeto &apos;[OBJECT_NAME]&apos; a
[OBJ_POSITION] de la región [REGION_NAME] porque la otra región ejecuta una versión más antigua que no admite la recepción de este objeto atravesando regiones.
@@ -3876,6 +3913,10 @@ Prueba otra vez dentro de un minuto.
<notification name="NoPermModifyObject">
No tienes permiso para modificar ese objeto
</notification>
+ <notification name="TooMuchObjectInventorySelected">
+ Están seleccionados demasiados objetos con un inventario grande. Selecciona menos objetos y repite la operación.
+ <usetemplate name="okbutton" yestext="Aceptar"/>
+ </notification>
<notification name="CantEnablePhysObjContributesToNav">
No se puede habilitar la física para un objeto que contribuye al navmesh.
</notification>
@@ -3912,6 +3953,12 @@ Prueba otra vez dentro de un minuto.
<notification name="CantSaveModifyAttachment">
No se puede guardar en el contenido del objeto: se modificarían los permisos de anexo.
</notification>
+ <notification name="AttachmentHasTooMuchInventory">
+ El inventario de tus anexos ya es excesivo, por lo que no se puede añadir más.
+ </notification>
+ <notification name="IllegalAttachment">
+ El anexo ha solicitado un punto que no existe en el avatar. Por tanto, se ha anexado al pecho.
+ </notification>
<notification name="TooManyScripts">
Demasiados scripts.
</notification>
@@ -4004,6 +4051,12 @@ Prueba otra vez dentro de un minuto.
<notification name="TeleportedByObjectUnknownUser">
Has sido teleportado por el objeto &apos;[OBJECT_NAME]&apos; cuyo propietario es un usuario desconocido.
</notification>
+ <notification name="StandDeniedByObject">
+ &apos;[OBJECT_NAME]&apos; no te permite ponerte de pie en este momento.
+ </notification>
+ <notification name="ResitDeniedByObject">
+ &apos;[OBJECT_NAME]&apos; no te permite cambiar de asiento en este momento.
+ </notification>
<notification name="CantCreateObjectRegionFull">
No se puede crear el objeto solicitado. La región está llena.
</notification>
@@ -4085,9 +4138,6 @@ Prueba otra vez dentro de un minuto.
<notification name="CantAttachNotEnoughScriptResources">
No hay suficientes recursos de script disponibles para anexar el objeto
</notification>
- <notification name="IllegalAttachment">
- El anexo ha solicitado un punto que no existe en el avatar. Por tanto, se ha anexado al pecho.
- </notification>
<notification name="CantDropItemTrialUser">
No se pueden soltar objetos aquí; inténtalo en la zona de prueba gratuita.
</notification>
@@ -4303,6 +4353,9 @@ Prueba a seleccionar un terreno más pequeño.
<notification name="CantTransfterMoneyRegionDisabled">
En esta región actualmente no están activadas las transferencias de dinero a los objetos.
</notification>
+ <notification name="DroppedMoneyTransferRequest">
+ No se puede efectuar el pago por sobrecarga del sistema.
+ </notification>
<notification name="CantPayNoAgent">
No se ha averiguado a quién se debe pagar.
</notification>
@@ -4338,4 +4391,8 @@ Prueba a seleccionar un terreno más pequeño.
El archivo de historial de chat todavía está realizando la operación anterior. Repite la operación dentro de unos minutos o inicia un chat con otra persona.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="OutfitPhotoLoadError">
+ [REASON]
+ <usetemplate name="okbutton" yestext="Aceptar"/>
+ </notification>
</notifications>
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 1107e72b54..5fff5b07c6 100644
--- a/indra/newview/skins/default/xui/es/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/es/panel_outfits_inventory.xml
@@ -7,6 +7,7 @@
Ponerme ítems seleccionados
</panel.string>
<tab_container name="appearance_tabs">
+ <panel label="GALERÍA DE VESTUARIO" name="outfit_gallery_tab"/>
<panel label="MIS VESTUARIOS" name="outfitslist_tab"/>
<panel label="PUESTO" name="cof_tab"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/es/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/es/panel_outfits_wearing.xml
index 8cea619bd5..508267a327 100644
--- a/indra/newview/skins/default/xui/es/panel_outfits_wearing.xml
+++ b/indra/newview/skins/default/xui/es/panel_outfits_wearing.xml
@@ -1,6 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Wearing">
+ <panel.string name="no_attachments">
+ No tienes puestos anexos.
+ </panel.string>
+ <accordion name="wearables_accordion">
+ <accordion_tab name="tab_wearables" title="Artículos de vestir"/>
+ <accordion_tab name="tab_temp_attachments" title="Anexos temporales"/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Ver más opciones"/>
+ <menu_button name="options_gear_btn" tool_tip="Ver más opciones"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
index 4fc973614b..0b3ca03bcc 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
@@ -30,6 +30,7 @@
<combo_box.item label="Descargaré e instalaré manualmente las actualizaciones" name="Install_manual"/>
</combo_box>
<check_box label="Admitir candidatos a la versión comercial a la hora de realizar actualizaciones" name="update_willing_to_test"/>
+ <check_box label="Mostrar las notas de la versión después de la actualización" name="update_show_release_notes"/>
<text name="Proxy Settings:">
Configuración de proxy:
</text>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 4e20793d86..192d32c267 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -52,17 +52,34 @@ Tarjeta gráfica: [GRAPHICS_CARD]
<string name="AboutDriver">
Versión de Windows Graphics Driver: [GRAPHICS_DRIVER_VERSION]
</string>
- <string name="AboutLibs">
+ <string name="AboutOGL">
Versión de OpenGL: [OPENGL_VERSION]
-
-Versión de J2C Decoder: [J2C_VERSION]
+ </string>
+ <string name="AboutSettings">
+ Tamaño de la ventana: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
+Ajuste de tamaño de fuente: [FONT_SIZE_ADJUSTMENT]pt
+Ajuste de escala de IU: [UI_SCALE]
+Distancia de dibujo: [DRAW_DISTANCE]m
+Ancho de banda: [NET_BANDWITH]kbit/s
+Factor de LOD: [LOD_FACTOR]
+Calidad de renderizado: [RENDER_QUALITY] / 7
+Modelo de iluminación avanzado: [GPU_SHADERS]
+Memoria de textura: [TEXTURE_MEMORY]MB
+Tiempo de creación de VFS (caché): [VFS_TIME]
+ </string>
+ <string name="AboutLibs">
+ Versión de J2C Decoder: [J2C_VERSION]
Versión de Audio Driver: [AUDIO_DRIVER_VERSION]
Versión de LLCEFLib/CEF: [LLCEFLIB_VERSION]
+Versión de LibVLC: [LLCEFLIB_VERSION]
Versión de Voice Server: [VOICE_VERSION]
</string>
<string name="AboutTraffic">
Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</string>
+ <string name="AboutTime">
+ [mes, fecha_hora, slt] [día, fecha_hora, slt] [año, fecha_hora, slt] [hora, fecha_hora, slt]:[min, fecha_hora, slt]:[segundo,fecha_hora,slt]
+ </string>
<string name="ErrorFetchingServerReleaseNotesURL">
Error al obtener la URL de las notas de la versión del servidor.
</string>
@@ -1074,6 +1091,9 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="TeleportYourAgent">
Teleportarte
</string>
+ <string name="ForceSitAvatar">
+ Forzar que el avatar se siente
+ </string>
<string name="AgentNameSubst">
(Tú)
</string>
@@ -1913,6 +1933,27 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="av_render_anyone">
Es posible que ninguno de los que están próximos pueda renderizarte.
</string>
+ <string name="hud_description_total">
+ Tu HUD
+ </string>
+ <string name="hud_name_with_joint">
+ [OBJ_NAME] (lo llevas en [JNT_NAME])
+ </string>
+ <string name="hud_render_memory_warning">
+ [HUD_DETAILS] usa mucha memoria de textura
+ </string>
+ <string name="hud_render_cost_warning">
+ [HUD_DETAILS] contiene muchas texturas y objetos complicados
+ </string>
+ <string name="hud_render_heavy_textures_warning">
+ [HUD_DETAILS] contiene muchas texturas grandes
+ </string>
+ <string name="hud_render_cramped_warning">
+ [HUD_DETAILS] contiene demasiados objetos
+ </string>
+ <string name="hud_render_textures_warning">
+ [HUD_DETAILS] contiene demasiadas texturas
+ </string>
<string name="AgeYearsA">
[COUNT] año
</string>
@@ -2072,6 +2113,9 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="ObjectOutOfRange">
Script (objeto fuera de rango)
</string>
+ <string name="ScriptWasDeleted">
+ Script (eliminado del inventario)
+ </string>
<string name="GodToolsObjectOwnedBy">
El objeto [OBJECT] es propiedad de [OWNER]
</string>
@@ -2642,6 +2686,15 @@ Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
<string name="Play Media">
Play/Pausa los media
</string>
+ <string name="IntelDriverPage">
+ http://www.intel.com/p/en_US/support/detect/graphics
+ </string>
+ <string name="NvidiaDriverPage">
+ http://www.nvidia.com/Download/index.aspx?lang=es
+ </string>
+ <string name="AMDDriverPage">
+ http://support.amd.com/us/Pages/AMDSupportHub.aspx
+ </string>
<string name="MBCmdLineError">
Ha habido un error analizando la línea de comando.
Por favor, consulta: http://wiki.secondlife.com/wiki/Client_parameters
@@ -4393,12 +4446,18 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="paid_you_ldollars">
[NAME] te ha pagado [AMOUNT] L$ [REASON].
</string>
+ <string name="paid_you_ldollars_gift">
+ [NAME] te ha pagado [AMOUNT] L$: [REASON]
+ </string>
<string name="paid_you_ldollars_no_reason">
[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_gift">
+ Has pagado [AMOUNT] L$ a [NAME]: [REASON]
+ </string>
<string name="you_paid_ldollars_no_info">
Has pagado[AMOUNT] L$
</string>
@@ -4411,6 +4470,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="you_paid_failure_ldollars">
No has pagado a [NAME] [AMOUNT] L$ [REASON].
</string>
+ <string name="you_paid_failure_ldollars_gift">
+ No has pagado a [NAME] [AMOUNT] L$: [REASON]
+ </string>
<string name="you_paid_failure_ldollars_no_info">
No has pagado [AMOUNT] L$.
</string>
@@ -4737,6 +4799,15 @@ Denuncia de infracción
<string name="texture_load_dimensions_error">
No se puede subir imágenes mayores de [WIDTH]*[HEIGHT]
</string>
+ <string name="outfit_photo_load_dimensions_error">
+ La foto del vestuario puede tener como máx. un tamaño de [WIDTH]*[HEIGHT]. Cambia el tamaño o utiliza otra imagen
+ </string>
+ <string name="outfit_photo_select_dimensions_error">
+ La foto del vestuario puede tener como máx. un tamaño de [WIDTH]*[HEIGHT]. Selecciona otra textura
+ </string>
+ <string name="outfit_photo_verify_dimensions_error">
+ No se pueden verificar las dimensiones de la foto. Espera hasta que aparezca el tamaño de la foto en el selector
+ </string>
<string name="words_separator" value=","/>
<string name="server_is_down">
Parece que hay algún problema que ha escapado a nuestros controles.
@@ -5241,6 +5312,9 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas
<string name="Command_Profile_Label">
Perfil
</string>
+ <string name="Command_Report_Abuse_Label">
+ Denunciar una infracción
+ </string>
<string name="Command_Search_Label">
Buscar
</string>
@@ -5331,6 +5405,9 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas
<string name="Command_Profile_Tooltip">
Consulta o edita tu perfil
</string>
+ <string name="Command_Report_Abuse_Tooltip">
+ Denunciar una infracción
+ </string>
<string name="Command_Search_Tooltip">
Buscar lugares, eventos y personas
</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_model_preview.xml b/indra/newview/skins/default/xui/fr/floater_model_preview.xml
index d3d941ff5c..4ebc196fd1 100644
--- a/indra/newview/skins/default/xui/fr/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_model_preview.xml
@@ -245,6 +245,7 @@
</text>
<check_box label="Inclure pondération de la peau :" name="upload_skin"/>
<check_box label="Inclure position des articulations :" name="upload_joints"/>
+ <check_box label="Verrouiller l’échelle si la position des articulations est définie" name="lock_scale_if_joint_position"/>
<text name="pelvis_offset_label">
Décalage Z (élever/abaisser l&apos;avatar) :
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_pay.xml b/indra/newview/skins/default/xui/fr/floater_pay.xml
index bbd20e868c..190a1f5369 100644
--- a/indra/newview/skins/default/xui/fr/floater_pay.xml
+++ b/indra/newview/skins/default/xui/fr/floater_pay.xml
@@ -1,9 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string name="payee_group">Payer le groupe</string>
- <string name="payee_resident">Payer le résident</string>
- <text name="paying_text">Vous payez :</text>
- <text name="payee_name">Test Name That Is Extremely Long To Check Clipping</text>
+ <string name="payee_group">
+ Payer le groupe
+ </string>
+ <string name="payee_resident">
+ Payer le résident
+ </string>
+ <text name="paying_text">
+ Vous payez :
+ </text>
+ <text name="payee_name">
+ Test Name That Is Extremely Long To Check Clipping
+ </text>
+ <text name="payment_message_label">
+ Description (facultative) :
+ </text>
<panel label="Rechercher" name="PatternsPanel">
<button label="Payer 1 L$" label_selected="Payer 1 L$" name="fastpay 1"/>
<button label="Payer 5 L$" label_selected="Payer 5 L$" name="fastpay 5"/>
@@ -11,7 +22,9 @@
<button label="Payer 20 L$" label_selected="Payer 20 L$" name="fastpay 20"/>
</panel>
<panel label="Rechercher" name="InputPanel">
- <text name="amount text">Autre montant :</text>
+ <text name="amount text">
+ Autre montant :
+ </text>
<button label="Payer" label_selected="Payer" name="pay btn"/>
<button label="Annuler" label_selected="Annuler" name="cancel btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/fr/floater_preferences_graphics_advanced.xml
index d3c4dcfa27..42cc2e6dac 100644
--- a/indra/newview/skins/default/xui/fr/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preferences_graphics_advanced.xml
@@ -15,7 +15,7 @@
<text name="AvatarText">
Avatar
</text>
- <slider label="Complexité max. :" name="IndirectMaxComplexity" tool_tip="Contrôle à quel moment un avatar complexe est représenté comme un « jelly baby »"/>
+ <slider label="Complexité max. :" name="IndirectMaxComplexity" tool_tip="Contrôle à quel moment un avatar complexe est représenté comme un « JellyDoll »"/>
<text name="IndirectMaxComplexityText">
0
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_script_queue.xml b/indra/newview/skins/default/xui/fr/floater_script_queue.xml
index b9a8165457..15cc182ff9 100644
--- a/indra/newview/skins/default/xui/fr/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/fr/floater_script_queue.xml
@@ -15,5 +15,11 @@
<floater.string name="NotRunning">
Arrêt
</floater.string>
+ <floater.string name="Timeout">
+ Délai : [OBJECT_NAME]
+ </floater.string>
+ <floater.string name="LoadingObjInv">
+ Chargement de l’inventaire pour : [OBJECT_NAME]
+ </floater.string>
<button label="Fermer" label_selected="Fermer" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_web_content.xml b/indra/newview/skins/default/xui/fr/floater_web_content.xml
index 65dfafe760..015396b2dd 100644
--- a/indra/newview/skins/default/xui/fr/floater_web_content.xml
+++ b/indra/newview/skins/default/xui/fr/floater_web_content.xml
@@ -10,5 +10,9 @@
<icon name="media_secure_lock_flag" tool_tip="Navigation sécurisée"/>
<button name="popexternal" tool_tip="Ouvrir l&apos;URL actuelle dans votre navigateur de bureau"/>
</layout_panel>
+ <layout_panel name="debug_controls">
+ <button name="web_test_home_page" tool_tip="Tests Web de la page d’accueil"/>
+ <button name="VLC Plugin Test" tool_tip="Test vidéo MPEG4"/>
+ </layout_panel>
</layout_stack>
</floater>
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 fd8112429e..ae19e78d54 100644
--- a/indra/newview/skins/default/xui/fr/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/fr/menu_attachment_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="Appeler" name="Call"/>
<menu_item_call label="Inviter dans le groupe" name="Invite..."/>
<menu_item_call label="Réinitialiser le squelette" name="Reset Skeleton"/>
+ <menu_item_call label="Réinitialiser le squelette et les animations" name="Reset Skeleton And Animations"/>
<menu_item_call label="Ignorer" name="Avatar Mute"/>
<menu_item_call label="Signaler" name="abuse"/>
<menu_item_call label="Figer" name="Freeze..."/>
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 f3089ad3bb..f354cf3896 100644
--- a/indra/newview/skins/default/xui/fr/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml
@@ -10,6 +10,7 @@
<menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
<menu_item_call label="Hauteur de sustentation" name="Hover Height"/>
<menu_item_call label="Réinitialiser le squelette" name="Reset Skeleton"/>
+ <menu_item_call label="Réinitialiser le squelette et les animations" name="Reset Skeleton And Animations"/>
<menu_item_call label="Mes amis" name="Friends..."/>
<menu_item_call label="Mes groupes" name="Groups..."/>
<menu_item_call label="Mon profil" name="Profile..."/>
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 b97c4b0f48..2a0ae38605 100644
--- a/indra/newview/skins/default/xui/fr/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/fr/menu_avatar_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="Appeler" name="Call"/>
<menu_item_call label="Inviter dans le groupe" name="Invite..."/>
<menu_item_call label="Réinitialiser le squelette" name="Reset Skeleton"/>
+ <menu_item_call label="Réinitialiser le squelette et les animations" name="Reset Skeleton And Animations"/>
<menu_item_call label="Ignorer" name="Avatar Mute"/>
<menu_item_call label="Signaler" name="abuse"/>
<menu_item_call label="Figer" name="Freeze..."/>
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 a4c1df8cee..2d0a17832f 100644
--- a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
@@ -27,6 +27,7 @@
<menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
<menu_item_call label="Hauteur de sustentation" name="Hover Height"/>
<menu_item_call label="Réinitialiser le squelette" name="Reset Skeleton"/>
+ <menu_item_call label="Réinitialiser le squelette et les animations" name="Reset Skeleton And Animations"/>
<menu_item_call label="Mes amis" name="Friends..."/>
<menu_item_call label="Mes groupes" name="Groups..."/>
<menu_item_call label="Mon profil" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/fr/menu_login.xml b/indra/newview/skins/default/xui/fr/menu_login.xml
index c425e6cee7..7fd68baf67 100644
--- a/indra/newview/skins/default/xui/fr/menu_login.xml
+++ b/indra/newview/skins/default/xui/fr/menu_login.xml
@@ -20,13 +20,12 @@
<menu_item_check label="Afficher le menu de débogage" name="Show Debug Menu"/>
<menu label="Débogage" name="Debug">
<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"/>
<menu label="Tests de l&apos;interface" name="UI Tests"/>
<menu_item_call label="Définir la taille de la fenêtre..." name="Set Window Size..."/>
<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 de débogage de la fenêtre flottante du contenu Web" name="Web Content Floater Debug Test"/>
+ <menu_item_call label="Navigateur de médias" name="Media Browser"/>
<menu label="Définir le niveau de connexion" name="Set Logging Level">
<menu_item_check label="Débogage" name="Debug"/>
<menu_item_check label="Infos" name="Info"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_object_icon.xml b/indra/newview/skins/default/xui/fr/menu_object_icon.xml
index 7c94930160..5d41ff5103 100644
--- a/indra/newview/skins/default/xui/fr/menu_object_icon.xml
+++ b/indra/newview/skins/default/xui/fr/menu_object_icon.xml
@@ -2,6 +2,7 @@
<menu name="Object Icon Menu">
<menu_item_call label="Profil de l&apos;objet..." name="Object Profile"/>
<menu_item_call label="Ignorer..." name="Block"/>
+ <menu_item_call label="Ne plus ignorer" name="Unblock"/>
<menu_item_call label="Voir sur la carte" name="show_on_map"/>
<menu_item_call label="Me téléporter à l’emplacement de l&apos;objet" name="teleport_to_object"/>
</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml b/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml
index 21b19eded6..28ae2f74ad 100644
--- a/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml
@@ -3,6 +3,10 @@
<menu_item_call label="Porter - Remplacer la tenue actuelle" name="wear"/>
<menu_item_call label="Porter - Ajouter à la tenue actuelle" name="wear_add"/>
<menu_item_call label="Enlever - Supprimer de la tenue actuelle" name="take_off"/>
+ <menu_item_call label="Charger la photo (10 L$)" name="upload_photo"/>
+ <menu_item_call label="Sélectionner une photo" name="select_photo"/>
+ <menu_item_call label="Prendre une photo" name="take_snapshot"/>
+ <menu_item_call label="Supprimer la photo" name="remove_photo"/>
<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"/>
@@ -27,4 +31,5 @@
<menu_item_call label="Réduire tous les dossiers" name="collapse"/>
<menu_item_call label="Renommer la tenue" name="rename"/>
<menu_item_call label="Supprimer la tenue" name="delete_outfit"/>
+ <menu_item_check label="Toujours trier les dossiers par nom" name="sort_folders_by_name"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_friends_view.xml b/indra/newview/skins/default/xui/fr/menu_people_friends_view.xml
index cc81172462..45cb646b9a 100644
--- a/indra/newview/skins/default/xui/fr/menu_people_friends_view.xml
+++ b/indra/newview/skins/default/xui/fr/menu_people_friends_view.xml
@@ -4,5 +4,6 @@
<menu_item_check label="Trier par statut" name="sort_status"/>
<menu_item_check label="Afficher les icônes des résidents" name="view_icons"/>
<menu_item_check label="Afficher les droits octroyés" name="view_permissions"/>
+ <menu_item_check label="Masquer les noms d’utilisateur" name="view_usernames"/>
<menu_item_check label="Afficher le journal des conversations..." name="view_conversation"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby.xml
index 6f7d02ef74..cbc3156a8f 100644
--- a/indra/newview/skins/default/xui/fr/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/fr/menu_people_nearby.xml
@@ -13,4 +13,6 @@
<menu_item_call label="Partager" name="share"/>
<menu_item_call label="Payer" name="pay"/>
<menu_item_check label="Ignorer/Ne plus ignorer" name="block_unblock"/>
+ <menu_item_call label="Figer" name="freeze"/>
+ <menu_item_call label="Expulser" name="eject"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby_view.xml
index 086002dce5..9da915fcc5 100644
--- a/indra/newview/skins/default/xui/fr/menu_people_nearby_view.xml
+++ b/indra/newview/skins/default/xui/fr/menu_people_nearby_view.xml
@@ -5,4 +5,5 @@
<menu_item_check label="Trier par distance" name="sort_distance"/>
<menu_item_check label="Afficher les icônes des résidents" name="view_icons"/>
<menu_item_check label="Afficher la carte" name="view_map"/>
+ <menu_item_check label="Masquer les noms d’utilisateur" name="view_usernames"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_url_objectim.xml b/indra/newview/skins/default/xui/fr/menu_url_objectim.xml
index 5d745ef5f8..95310dd1f1 100644
--- a/indra/newview/skins/default/xui/fr/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/fr/menu_url_objectim.xml
@@ -2,6 +2,7 @@
<context_menu name="Url Popup">
<menu_item_call label="Profil de l&apos;objet…" name="show_object"/>
<menu_item_call label="Ignorer…" name="block_object"/>
+ <menu_item_call label="Ne plus ignorer" name="unblock_object"/>
<menu_item_call label="Voir sur la carte" name="show_on_map"/>
<menu_item_call label="Me téléporter à l&apos;emplacement de l&apos;objet" name="teleport_to_object"/>
<menu_item_call label="Copier le nom de l&apos;objet dans le presse-papiers" name="url_copy_label"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index 3c9f5c2aa9..d40e979d08 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -113,11 +113,11 @@
<menu_item_call label="Lien" name="Link"/>
<menu_item_call label="Annuler le lien" name="Unlink"/>
<menu_item_check label="Modifier les parties liées" name="Edit Linked Parts"/>
- <menu label="Sélectionner les parties liées" name="Select Linked Parts">
- <menu_item_call label="Sélectionner la partie suivante" name="Select Next Part"/>
- <menu_item_call label="Sélectionner la partie précédente" name="Select Previous Part"/>
- <menu_item_call label="Inclure la partie suivante" name="Include Next Part"/>
- <menu_item_call label="Inclure la partie précédente" name="Include Previous Part"/>
+ <menu label="Sélectionner des éléments" name="Select Elements">
+ <menu_item_call label="Sélectionner la partie suivante ou le visage" name="Select Next Part or Face"/>
+ <menu_item_call label="Sélectionner la partie précédente ou le visage" name="Select Previous Part or Face"/>
+ <menu_item_call label="Inclure la partie suivante ou le visage" name="Include Next Part or Face"/>
+ <menu_item_call label="Inclure la partie précédente ou le visage" name="Include Previous Part or Face"/>
</menu>
<menu_item_call label="Groupes de liens..." name="pathfinding_linkset_menu_item"/>
<menu_item_call label="Point central sur la sélection" name="Focus on Selection"/>
@@ -368,8 +368,7 @@
<menu_item_call label="Vidage de cache d&apos;objet de la région" name="Dump Region Object Cache"/>
</menu>
<menu label="Interface" name="UI">
- <menu_item_call label="Test du navigateur de médias" name="Web Browser Test"/>
- <menu_item_call label="Navigateur du contenu Web" name="Web Content Browser"/>
+ <menu_item_call label="Navigateur de médias" name="Media Browser"/>
<menu_item_call label="Dump SelectMgr" name="Dump SelectMgr"/>
<menu_item_call label="Dump inventaire" name="Dump Inventory"/>
<menu_item_call label="Dump Timers" name="Dump Timers"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_wearing_tab.xml b/indra/newview/skins/default/xui/fr/menu_wearing_tab.xml
index 4d88445506..5a7193a7cc 100644
--- a/indra/newview/skins/default/xui/fr/menu_wearing_tab.xml
+++ b/indra/newview/skins/default/xui/fr/menu_wearing_tab.xml
@@ -3,4 +3,6 @@
<menu_item_call label="Enlever" name="take_off"/>
<menu_item_call label="Détacher" name="detach"/>
<menu_item_call label="Modifier la tenue" name="edit"/>
+ <menu_item_call label="Modifier" name="edit_item"/>
+ <menu_item_call label="Afficher l’original" name="show_original"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/mime_types.xml b/indra/newview/skins/default/xui/fr/mime_types.xml
index 322887fb76..15b1dc5a23 100644
--- a/indra/newview/skins/default/xui/fr/mime_types.xml
+++ b/indra/newview/skins/default/xui/fr/mime_types.xml
@@ -22,14 +22,6 @@
Jouer le film
</playtip>
</widgetset>
- <widgetset name="none">
- <label name="none_label">
- Aucun contenu
- </label>
- <tooltip name="none_tooltip">
- Aucun média ici
- </tooltip>
- </widgetset>
<widgetset name="image">
<label name="image_label">
Image
@@ -52,11 +44,24 @@
Jouer le contenu audio qui se trouve ici
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ Aucun contenu
+ </label>
+ <tooltip name="none_tooltip">
+ Aucun média ici
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Flux en temps réel
</label>
</scheme>
+ <scheme name="libvlc">
+ <label name="libvlc_label">
+ Médias pris en charge par LibVLC
+ </label>
+ </scheme>
<mimetype name="blank">
<label name="blank_label">
- Aucun -
@@ -127,11 +132,6 @@
Macromedia Director
</label>
</mimetype>
- <mimetype name="application/x-shockwave-flash">
- <label name="application/x-shockwave-flash_label">
- Flash
- </label>
- </mimetype>
<mimetype name="audio/mid">
<label name="audio/mid_label">
Audio (MIDI)
@@ -207,6 +207,11 @@
Film (MP4)
</label>
</mimetype>
+ <mimetype name="application/octet-stream">
+ <label name="video/octet-stream">
+ Film
+ </label>
+ </mimetype>
<mimetype name="video/quicktime">
<label name="video/quicktime_label">
Film (Quicktime)
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 2310fc5611..b7efaad376 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -329,6 +329,9 @@ Si vous ne voulez plus que ce rôle dispose de ces pouvoirs, désactivez-les imm
Vous allez bannir [COUNT] membres du groupe.
<usetemplate ignoretext="Confirmer le bannissement de plusieurs membres du groupe" name="okcancelignore" notext="Annuler" yestext="Bannir"/>
</notification>
+ <notification name="GroupBanUserOnBanlist">
+ Il est possible qu’une invitation n’ait pas été envoyée à certains résidents, car ils sont bannis du groupe.
+ </notification>
<notification name="AttachmentDrop">
Vous êtes sur le point d&apos;abandonner l&apos;élément joint.
Voulez-vous vraiment continuer ?
@@ -456,6 +459,12 @@ Pour ne placer le média que sur une seule face, choisissez Sélectionner une fa
<notification name="ErrorEncodingSnapshot">
Erreur d&apos;encodage de la photo.
</notification>
+ <notification name="ErrorPhotoCannotAfford">
+ Il vous faut [COST] L$ pour enregistrer une photo dans votre inventaire. Vous pouvez acheter des L$ ou enregistrer la photo sur votre ordinateur.
+ </notification>
+ <notification name="ErrorTextureCannotAfford">
+ Il vous faut [COST] L$ pour enregistrer une texture dans votre inventaire. Vous pouvez acheter des L$ ou enregistrer la photo sur votre ordinateur.
+ </notification>
<notification name="ErrorUploadingPostcard">
Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON]
</notification>
@@ -574,6 +583,10 @@ Remarque : cela videra le cache.
Supprimer la note ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
+ <notification name="LoadPreviousReportScreenshot">
+ Voulez-vous utiliser la capture d’écran précédente pour votre rapport ?
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
L&apos;enregistrement du geste a échoué.
Il y a trop d&apos;étapes dans ce geste.
@@ -634,30 +647,12 @@ Consulter [_URL] pour en savoir plus ?
</url>
<usetemplate ignoretext="Mon matériel n&apos;est pas pris en charge" name="okcancelignore" notext="Non" yestext="Oui"/>
</notification>
- <notification name="IntelOldDriver">
- Il existe probablement un pilote plus récent pour votre puce graphique. La mise à jour des pilotes graphiques est susceptible d&apos;améliorer considérablement les performances.
-
- Visiter la page [_URL] pour rechercher d&apos;éventuelles mises à jour de pilotes ?
- <url name="url">
- http://www.intel.com/p/fr_FR/support/detect/graphics
- </url>
- <usetemplate ignoretext="Mon pilote graphique est obsolète." name="okcancelignore" notext="Non" yestext="Oui"/>
- </notification>
- <notification name="AMDOldDriver">
- Il existe probablement un pilote plus récent pour votre puce graphique. La mise à jour des pilotes graphiques est susceptible d&apos;améliorer considérablement les performances.
-
- Visiter la page [_URL] pour rechercher d&apos;éventuelles mises à jour de pilotes ?
- <url name="url">
- http://support.amd.com/us/Pages/AMDSupportHub.aspx
- </url>
- <usetemplate ignoretext="Mon pilote graphique est obsolète." name="okcancelignore" notext="Non" yestext="Oui"/>
- </notification>
- <notification name="NVIDIAOldDriver">
- Il existe probablement un pilote plus récent pour votre puce graphique. La mise à jour des pilotes graphiques est susceptible d&apos;améliorer considérablement les performances.
+ <notification name="OldGPUDriver">
+ Il existe probablement un pilote plus récent pour votre puce graphique. La mise à jour des pilotes graphiques est susceptible d’améliorer considérablement les performances.
- Visiter la page [_URL] pour rechercher d&apos;éventuelles mises à jour de pilotes ?
+ Visiter la page [URL] pour rechercher d’éventuelles mises à jour de pilotes ?
<url name="url">
- http://www.nvidia.com/Download/index.aspx?lang=fr
+ [URL]
</url>
<usetemplate ignoretext="Mon pilote graphique est obsolète." name="okcancelignore" notext="Non" yestext="Oui"/>
</notification>
@@ -748,6 +743,9 @@ Aller sur [_URL] pour obtenir des informations sur l&apos;achat de L$ ?
</url>
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
+ <notification name="MuteLimitReached">
+ Impossible d’ajouter une nouvelle entrée à la liste des ignorés car vous avez atteint la limite de [MUTE_LIMIT] entrées.
+ </notification>
<notification name="UnableToLinkObjects">
Impossible de lier ces [COUNT] objets.
Vous pouvez lier un maximum de [MAX] objets.
@@ -1374,6 +1372,11 @@ Vous pouvez utiliser [SECOND_LIFE] normalement, les autres résidents vous voien
</notification>
<notification name="AgentComplexity">
Votre [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 complexité de l&apos;avatar] est [AGENT_COMPLEXITY].
+ <usetemplate ignoretext="M’avertir quand la complexité de mon avatar change" name="notifyignore"/>
+ </notification>
+ <notification name="HUDComplexityWarning">
+ [HUD_REASON], cela risque d’avoir un impact négatif sur votre performance.
+ <usetemplate ignoretext="M’avertir quand la complexité de mon HUD est trop élevée" name="notifyignore"/>
</notification>
<notification name="FirstRun">
L&apos;installation de [APP_NAME] est terminée.
@@ -1466,6 +1469,10 @@ Veuillez ne sélectionner qu&apos;un seul objet.
Téléporter tous les résidents de cette région chez eux ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
+ <notification name="ChangeObjectBonusFactor">
+ Si vous réduisez le bonus objets après que des constructions ont été établies dans une région, certains objets risquent d’être renvoyés ou supprimés. Voulez-vous vraiment modifier le bonus objets ?
+ <usetemplate ignoretext="Confirmer la modification du facteur Bonus objets" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ </notification>
<notification name="EstateObjectReturn">
Etes-vous certain de vouloir renvoyer les objets appartenant à [USER_NAME] ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
@@ -1514,6 +1521,9 @@ Dépasse la limite fixée à [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS].
<notification name="OwnerCanNotBeDenied">
Impossible d&apos;ajouter le propriétaire du domaine à la liste des résidents bannis.
</notification>
+ <notification name="ProblemAddingEstateManagerBanned">
+ Impossible d’ajouter un résident banni à la liste des gérants de domaine.
+ </notification>
<notification name="CanNotChangeAppearanceUntilLoaded">
Impossible de changer d&apos;apparence jusqu&apos;à ce que les habits et la silhouette soient chargés.
</notification>
@@ -1688,6 +1698,10 @@ Si vous êtes impatients de découvrir les dernières fonctionnalités et correc
Voulez-vous ouvrir votre navigateur web système pour afficher ce contenu ?
<usetemplate ignoretext="Ouvrir mon navigateur pour consulter une page web" name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
+ <notification name="SystemUIScaleFactorChanged">
+ Le facteur de taille de l’interface système a changé depuis la dernière exécution. Voulez-vous ouvrir la page des paramètres d’ajustement de la taille de l’interface ?
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+ </notification>
<notification name="WebLaunchJoinNow">
Accéder à votre [http://secondlife.com/account/ Page d&apos;accueil] pour gérer votre compte ?
<usetemplate ignoretext="Lancer mon navigateur pour gérer mon compte" name="okcancelignore" notext="Annuler" yestext="OK"/>
@@ -1727,10 +1741,17 @@ Si vous êtes impatients de découvrir les dernières fonctionnalités et correc
Quitter le groupe ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
+ <notification name="GroupDepart">
+ Vous avez quitté le groupe « [group_name] ».
+ </notification>
<notification name="OwnerCannotLeaveGroup">
Impossible de quitter le groupe. Vous ne pouvez pas quitter le groupe car vous en êtes le dernier propriétaire. Vous devez d&apos;abord affecter le rôle de propriétaire à un autre membre.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="GroupDepartError">
+ Impossible de quitter le groupe.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="ConfirmKick">
Souhaitez-vous vraiment éjecter tous les résidents de la grille ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Éjecter tous les résidents"/>
@@ -2130,6 +2151,10 @@ Cette action modifiera des milliers de régions et sera difficile à digérer po
Vous avez sélectionné trop de prims. Veuillez sélectionner au maximum [MAX_PRIM_COUNT] prims et réessayer.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="TooManyScriptsSelected">
+ Trop de scripts dans les objets sélectionnés. Sélectionnez moins d’objets et réessayez.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="ProblemImportingEstateCovenant">
Problème lors de l&apos;importation du règlement du domaine.
<usetemplate name="okbutton" yestext="OK"/>
@@ -2298,6 +2323,10 @@ Déplacer les objets de l&apos;inventaire ?
Échec de paiement : objet introuvable.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="PaymentBlockedButtonMismatch">
+ Paiement interrompu : le prix payé ne correspond à aucun des boutons de paiement pour cet objet.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
Vous n&apos;êtes autorisé à copier aucun élément dans cet objet.
</notification>
@@ -2333,6 +2362,12 @@ Vous ne pouvez pas l&apos;annuler.
C’est une vaste sélection avec des groupes de liens. Si vous annulez les liens, vous risquez de ne pas pouvoir les rétablir. Vous devriez peut-être faire des copies des groupes de liens dans votre inventaire par mesure de précaution.
<usetemplate ignoretext="Confirmer l’annulation des liens d’un groupe de liens" name="okcancelignore" notext="Annuler" yestext="Annuler le lien"/>
</notification>
+ <notification name="HelpReportAbuseConfirm">
+ Nous vous remercions d’avoir pris le temps de nous signaler ce problème.
+Nous lirons votre rapport pour identifier toute violation potentielle et prendrons
+les mesures nécessaires.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="HelpReportAbuseSelectCategory">
Veuillez choisir une catégorie pour ce rapport d&apos;infraction.
Le choix d&apos;une catégorie nous permet de traiter les rapports d&apos;infraction plus rapidement.
@@ -2762,6 +2797,10 @@ Vous ne pouvez pas voler ici.
<notification name="PathfindingDirty">
Des modifications de recherche de chemin sont en attente concernant cette région. Si vous disposez de droits de construction, vous pouvez la figer de nouveau en cliquant sur le bouton Refiger la région.
</notification>
+ <notification name="PathfindingDirtyRebake">
+ Des modifications de recherche de chemin sont en attente concernant cette région. Si vous disposez de droits de construction, vous pouvez la figer de nouveau en cliquant sur le bouton Refiger la région.
+ <usetemplate name="okbutton" yestext="Refiger la région"/>
+ </notification>
<notification name="DynamicPathfindingDisabled">
La recherche de chemin dynamique n&apos;est pas activée dans cette région. Il se peut que les objets scriptés utilisant des appels LSL de recherche de chemin ne fonctionnent pas comme prévu pour cette région.
</notification>
@@ -3268,11 +3307,13 @@ Elles vont être bloquées pendant quelques secondes pour votre sécurité.
L&apos;apparence a été enregistrée en XML vers [PATH]
</notification>
<notification name="AppearanceToXMLFailed">
- Échec d&apos;enregistrement de l&apos;apparence en XML.
- icon=&quot;notifytip.tga&quot;
- name=&quot;PresetNotDeleted&quot;
- type=&quot;notifytip&quot;&gt;
-Erreur de suppression du préréglage [NAME].
+ Échec de l’enregistrement de l’apparence au format XML.
+ </notification>
+ <notification name="PresetNotSaved">
+ Erreur d’enregistrement du préréglage [NAME].
+ </notification>
+ <notification name="PresetNotDeleted">
+ Erreur de suppression du préréglage [NAME].
</notification>
<notification name="UnableToFindHelpTopic">
Impossible de trouver l&apos;aide.
@@ -3482,13 +3523,6 @@ Cliquez sur un point dans le monde et faites glisser votre souris pour faire tou
<notification name="ForceQuitDueToLowMemory">
Mémoire insuffisante : fermeture de SL dans 30 secondes.
</notification>
- <notification name="PopupAttempt">
- Impossible d&apos;ouvrir une fenêtre popup.
- <form name="form">
- <ignore name="ignore" text="Activer toutes les fenêtres popup"/>
- <button name="open" text="Ouvrir la fenêtre popup"/>
- </form>
- </notification>
<notification name="SOCKS_NOT_PERMITTED">
Le proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; a refusé la connexion, non autorisée par le jeu de règles défini.
<usetemplate name="okbutton" yestext="OK"/>
@@ -3862,6 +3896,9 @@ Veuillez réessayer dans une minute.
Impossible de déplacer [OBJECT_NAME] jusqu&apos;à
[OBJ_POSITION] dans la région [REGION_NAME] car il n&apos;y a pas suffisamment de ressources pour cet objet sur cette parcelle.
</notification>
+ <notification name="NoParcelPermsNoObject">
+ La copie a échoué car vous n’avez pas accès à cette parcelle.
+ </notification>
<notification name="CantMoveObjectRegionVersion">
Impossible de déplacer [OBJECT_NAME] jusqu&apos;à
[OBJ_POSITION] dans la région [REGION_NAME] car l&apos;autre région exécute une version plus ancienne qui ne prend pas en charge la réception de cet objet via le passage à une autre région.
@@ -3877,6 +3914,10 @@ Veuillez réessayer dans une minute.
<notification name="NoPermModifyObject">
Vous n&apos;êtes pas autorisé à modifier cet objet.
</notification>
+ <notification name="TooMuchObjectInventorySelected">
+ Trop d’objets avec un inventaire volumineux sont sélectionnés. Sélectionnez moins d’objets et réessayez.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CantEnablePhysObjContributesToNav">
Impossible d&apos;activer les propriétés physiques pour un objet qui contribue au maillage de navigation.
</notification>
@@ -3913,6 +3954,12 @@ Veuillez réessayer dans une minute.
<notification name="CantSaveModifyAttachment">
Impossible d&apos;enregistrer dans le contenu des objets : cela modifierait les droits d&apos;attache.
</notification>
+ <notification name="AttachmentHasTooMuchInventory">
+ Vos éléments attachés contiennent trop d’articles d’inventaire, impossible d’en ajouter plus.
+ </notification>
+ <notification name="IllegalAttachment">
+ La pièce jointe a demandé un point non existant sur l&apos;avatar. Il a été fixé sur la poitrine.
+ </notification>
<notification name="TooManyScripts">
Trop de scripts.
</notification>
@@ -4005,6 +4052,12 @@ Veuillez réessayer dans une minute.
<notification name="TeleportedByObjectUnknownUser">
Vous avez été téléporté par l&apos;objet [OBJECT_NAME] appartenant à un utilisateur inconnu.
</notification>
+ <notification name="StandDeniedByObject">
+ [OBJECT_NAME] ne vous permet pas de vous tenir debout actuellement.
+ </notification>
+ <notification name="ResitDeniedByObject">
+ « [OBJECT_NAME] » ne vous permet pas de changer de place actuellement.
+ </notification>
<notification name="CantCreateObjectRegionFull">
Création de l&apos;objet demandé impossible. La région est pleine.
</notification>
@@ -4086,9 +4139,6 @@ Veuillez réessayer dans une minute.
<notification name="CantAttachNotEnoughScriptResources">
Ressources de script insuffisantes pour attacher cet objet.
</notification>
- <notification name="IllegalAttachment">
- La pièce jointe a demandé un point non existant sur l&apos;avatar. Il a été fixé sur la poitrine.
- </notification>
<notification name="CantDropItemTrialUser">
Vous ne pouvez pas déposer d&apos;objets ici. Essayez la zone de période d&apos;essai gratuite.
</notification>
@@ -4304,6 +4354,9 @@ Veuillez sélectionner un terrain plus petit.
<notification name="CantTransfterMoneyRegionDisabled">
Les transferts d&apos;argent aux objets sont actuellement désactivés dans cette région.
</notification>
+ <notification name="DroppedMoneyTransferRequest">
+ Impossible d’effectuer le paiement à cause de la charge système.
+ </notification>
<notification name="CantPayNoAgent">
Impossible de savoir qui payer.
</notification>
@@ -4339,4 +4392,8 @@ Veuillez sélectionner un terrain plus petit.
Le fichier d&apos;historique des chats est occupé à traiter l&apos;opération précédente. Réessayez dans quelques minutes ou choisissez une autre personne pour le chat.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="OutfitPhotoLoadError">
+ [REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
</notifications>
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 1bc553c8c0..05c689dd34 100644
--- a/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml
@@ -7,6 +7,7 @@
Porter les articles sélectionnés
</panel.string>
<tab_container name="appearance_tabs">
+ <panel label="GALERIE DES TENUES" name="outfit_gallery_tab"/>
<panel label="MES TENUES" name="outfitslist_tab"/>
<panel label="PORTÉ" name="cof_tab"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/fr/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/fr/panel_outfits_wearing.xml
index 874bab2daa..1752f9dfdf 100644
--- a/indra/newview/skins/default/xui/fr/panel_outfits_wearing.xml
+++ b/indra/newview/skins/default/xui/fr/panel_outfits_wearing.xml
@@ -1,6 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Wearing">
+ <panel.string name="no_attachments">
+ Aucun élément attaché porté.
+ </panel.string>
+ <accordion name="wearables_accordion">
+ <accordion_tab name="tab_wearables" title="Articles à porter"/>
+ <accordion_tab name="tab_temp_attachments" title="Éléments attachés temporaires"/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Afficher d&apos;autres options"/>
+ <menu_button name="options_gear_btn" tool_tip="Afficher d&apos;autres options"/>
</panel>
</panel>
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 2b1e613fe4..60cdd5df41 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
@@ -24,7 +24,7 @@
<text name="BetterText">
Meilleure
</text>
- <slider label="Complexité max. de l&apos;avatar :" name="IndirectMaxComplexity" tool_tip="Contrôle à quel moment un avatar complexe est représenté comme un « jelly baby »"/>
+ <slider label="Complexité max. de l&apos;avatar :" name="IndirectMaxComplexity" tool_tip="Contrôle à quel moment un avatar complexe est représenté comme un « JellyDoll »"/>
<text name="IndirectMaxComplexityText">
0
</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
index bd21f9782d..3b819b40c8 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
@@ -30,6 +30,7 @@
<combo_box.item label="Je téléchargerai et installerai les mises à jour manuellement" name="Install_manual"/>
</combo_box>
<check_box label="Accepte de passer aux versions avant sortie officielle" name="update_willing_to_test"/>
+ <check_box label="Afficher les notes de version après la mise à jour" name="update_show_release_notes"/>
<text name="Proxy Settings:">
Paramètres de proxy :
</text>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 843467df96..40a41b93ab 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -61,17 +61,34 @@ Carte graphique : [GRAPHICS_CARD]
<string name="AboutDriver">
Version Windows Graphics Driver : [GRAPHICS_DRIVER_VERSION]
</string>
- <string name="AboutLibs">
+ <string name="AboutOGL">
Version OpenGL : [OPENGL_VERSION]
-
-Version J2C Decoder : [J2C_VERSION]
+ </string>
+ <string name="AboutSettings">
+ Taille de la fenêtre : [WINDOW_WIDTH]x[WINDOW_HEIGHT]
+Ajustement de la taille de la police : [FONT_SIZE_ADJUSTMENT] pts
+Échelle de l’interface : [UI_SCALE]
+Limite d’affichage : [DRAW_DISTANCE] m
+Bande passante : [NET_BANDWITH] kbit/s
+Facteur LOD (niveau de détail) : [LOD_FACTOR]
+Qualité de rendu : [RENDER_QUALITY] / 7
+Modèle d’éclairage avancé : [GPU_SHADERS]
+Mémoire textures : [TEXTURE_MEMORY] Mo
+Durée de création VFS (cache) : [VFS_TIME]
+ </string>
+ <string name="AboutLibs">
+ Version J2C Decoder : [J2C_VERSION]
Version Audio Driver : [AUDIO_DRIVER_VERSION]
Version LLCEFLib/CEF : [LLCEFLIB_VERSION]
+Version LibVLC : [LIBVLC_VERSION]
Version serveur vocal : [VOICE_VERSION]
</string>
<string name="AboutTraffic">
Paquets perdus : [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</string>
+ <string name="AboutTime">
+ [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]
+ </string>
<string name="ErrorFetchingServerReleaseNotesURL">
Erreur lors de la récupération de l&apos;URL des notes de version du serveur.
</string>
@@ -1089,6 +1106,9 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="TeleportYourAgent">
Vous téléporter
</string>
+ <string name="ForceSitAvatar">
+ Forcez votre avatar à s’asseoir
+ </string>
<string name="NotConnected">
Pas connecté(e)
</string>
@@ -1937,6 +1957,27 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="av_render_anyone">
Vous risquez de n’être rendu par aucune des personnes qui vous entourent.
</string>
+ <string name="hud_description_total">
+ Votre HUD
+ </string>
+ <string name="hud_name_with_joint">
+ [OBJ_NAME] (porté sur [JNT_NAME])
+ </string>
+ <string name="hud_render_memory_warning">
+ [HUD_DETAILS] utilise beaucoup de mémoire textures
+ </string>
+ <string name="hud_render_cost_warning">
+ [HUD_DETAILS] contient beaucoup de textures et d’objets volumineux
+ </string>
+ <string name="hud_render_heavy_textures_warning">
+ [HUD_DETAILS] contient beaucoup de textures volumineuses
+ </string>
+ <string name="hud_render_cramped_warning">
+ [HUD_DETAILS] contient trop d’objets
+ </string>
+ <string name="hud_render_textures_warning">
+ [HUD_DETAILS] contient trop de textures
+ </string>
<string name="AgeYearsA">
[COUNT] an
</string>
@@ -2096,6 +2137,9 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="ObjectOutOfRange">
Script (objet hors de portée)
</string>
+ <string name="ScriptWasDeleted">
+ Script (supprimé de l’inventaire)
+ </string>
<string name="GodToolsObjectOwnedBy">
Objet [OBJECT] appartenant à [OWNER]
</string>
@@ -2708,6 +2752,15 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="Play Media">
Lire/pauser le média
</string>
+ <string name="IntelDriverPage">
+ http://www.intel.com/p/fr_FR/support/detect/graphics
+ </string>
+ <string name="NvidiaDriverPage">
+ http://www.nvidia.com/Download/index.aspx?lang=fr
+ </string>
+ <string name="AMDDriverPage">
+ http://support.amd.com/us/Pages/AMDSupportHub.aspx
+ </string>
<string name="MBCmdLineError">
Une erreur est survenue lors de la lecture de la ligne de commande.
Merci de consulter : http://wiki.secondlife.com/wiki/Client_parameters
@@ -4483,12 +4536,18 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="paid_you_ldollars">
[NAME] vous a payé [AMOUNT] L$ [REASON].
</string>
+ <string name="paid_you_ldollars_gift">
+ [NAME] vous a payé [AMOUNT] L$ : [REASON]
+ </string>
<string name="paid_you_ldollars_no_reason">
[NAME] vous a payé [AMOUNT] L$.
</string>
<string name="you_paid_ldollars">
Vous avez payé à [AMOUNT] L$ [REASON].
</string>
+ <string name="you_paid_ldollars_gift">
+ Vous avez payé à [NAME] [AMOUNT] L$ : [REASON]
+ </string>
<string name="you_paid_ldollars_no_info">
Vous avez payé [AMOUNT] L$.
</string>
@@ -4501,6 +4560,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="you_paid_failure_ldollars">
Votre paiement de [AMOUNT] L$ à [NAME] [REASON] a échoué.
</string>
+ <string name="you_paid_failure_ldollars_gift">
+ Votre paiement de [AMOUNT] L$ à [NAME] a échoué : [REASON]
+ </string>
<string name="you_paid_failure_ldollars_no_info">
Votre paiement de [AMOUNT] L$ a échoué.
</string>
@@ -4827,6 +4889,15 @@ du rapport d&apos;infraction
<string name="texture_load_dimensions_error">
Impossible de charger des images de taille supérieure à [WIDTH]*[HEIGHT]
</string>
+ <string name="outfit_photo_load_dimensions_error">
+ Taille max. de la photo de la tenue : [WIDTH]*[HEIGHT]. Redimensionnez l’image ou utilisez-en une autre.
+ </string>
+ <string name="outfit_photo_select_dimensions_error">
+ Taille max. de la photo de la tenue : [WIDTH]*[HEIGHT]. Sélectionnez une autre texture.
+ </string>
+ <string name="outfit_photo_verify_dimensions_error">
+ Impossible de vérifier les dimensions de la photo. Attendez que la taille de la photo s’affiche dans le sélecteur.
+ </string>
<string name="words_separator" value=","/>
<string name="server_is_down">
Malgré nos efforts, une erreur inattendue s&apos;est produite.
@@ -5331,6 +5402,9 @@ Essayez avec le chemin d&apos;accès à l&apos;éditeur entre guillemets doubles
<string name="Command_Profile_Label">
Profil
</string>
+ <string name="Command_Report_Abuse_Label">
+ Signaler une infraction
+ </string>
<string name="Command_Search_Label">
Recherche
</string>
@@ -5421,6 +5495,9 @@ Essayez avec le chemin d&apos;accès à l&apos;éditeur entre guillemets doubles
<string name="Command_Profile_Tooltip">
Modifier ou afficher votre profil
</string>
+ <string name="Command_Report_Abuse_Tooltip">
+ Signaler une infraction
+ </string>
<string name="Command_Search_Tooltip">
Trouver des lieux, personnes, événements
</string>
diff --git a/indra/newview/skins/default/xui/it/floater_model_preview.xml b/indra/newview/skins/default/xui/it/floater_model_preview.xml
index 1fe2659e4b..95fe4aaf4c 100644
--- a/indra/newview/skins/default/xui/it/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/it/floater_model_preview.xml
@@ -245,6 +245,7 @@
</text>
<check_box label="Includi peso pelle" name="upload_skin"/>
<check_box label="Includi posizioni giunti" name="upload_joints"/>
+ <check_box label="Blocca scala se è definita la posizione dei giunti" name="lock_scale_if_joint_position"/>
<text name="pelvis_offset_label">
Spostamento Z (sposta l&apos;avatar in alto o in basso):
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_pay.xml b/indra/newview/skins/default/xui/it/floater_pay.xml
index ef24fc850d..fc2e7c676c 100644
--- a/indra/newview/skins/default/xui/it/floater_pay.xml
+++ b/indra/newview/skins/default/xui/it/floater_pay.xml
@@ -1,9 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string name="payee_group">Paga gruppo</string>
- <string name="payee_resident">Paga residente</string>
- <text name="paying_text">Stai pagando:</text>
- <text left="115" name="payee_name">Nome di test che è troppo lungo per controllare il taglio</text>
+ <string name="payee_group">
+ Paga gruppo
+ </string>
+ <string name="payee_resident">
+ Paga residente
+ </string>
+ <text name="paying_text">
+ Stai pagando:
+ </text>
+ <text left="115" name="payee_name">
+ Nome di test che è troppo lungo per controllare il taglio
+ </text>
+ <text name="payment_message_label">
+ Descrizione (facoltativa):
+ </text>
<panel label="Cerca" name="PatternsPanel">
<button label="Paga 1 L$" label_selected="Paga 1 L$" name="fastpay 1"/>
<button label="Paga 5 L$" label_selected="Paga 5 L$" name="fastpay 5"/>
@@ -11,7 +22,9 @@
<button label="Paga 20 L$" label_selected="Paga 20 L$" name="fastpay 20"/>
</panel>
<panel label="Cerca" name="InputPanel">
- <text name="amount text">Altro importo:</text>
+ <text name="amount text">
+ Altro importo:
+ </text>
<button label="Paga" label_selected="Paga" name="pay btn"/>
<button label="Annulla" label_selected="Annulla" name="cancel btn"/>
</panel>
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 f4117d30a2..d0d0123283 100644
--- a/indra/newview/skins/default/xui/it/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/it/floater_script_queue.xml
@@ -15,5 +15,11 @@
<floater.string name="NotRunning">
Non in esecuzione
</floater.string>
+ <floater.string name="Timeout">
+ Timeout: [OBJECT_NAME]
+ </floater.string>
+ <floater.string name="LoadingObjInv">
+ Caricamento inventario per: [OBJECT_NAME]
+ </floater.string>
<button label="Chiudi" label_selected="Chiudi" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_web_content.xml b/indra/newview/skins/default/xui/it/floater_web_content.xml
index 5603e85417..87bbf07937 100644
--- a/indra/newview/skins/default/xui/it/floater_web_content.xml
+++ b/indra/newview/skins/default/xui/it/floater_web_content.xml
@@ -10,5 +10,9 @@
<icon name="media_secure_lock_flag" tool_tip="Navigazione sicura"/>
<button name="popexternal" tool_tip="Apri URL corrente nel browser del computer"/>
</layout_panel>
+ <layout_panel name="debug_controls">
+ <button name="web_test_home_page" tool_tip="Home page test web"/>
+ <button name="VLC Plugin Test" tool_tip="Test video MPEG4"/>
+ </layout_panel>
</layout_stack>
</floater>
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 5c017a92b5..1832400298 100644
--- a/indra/newview/skins/default/xui/it/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/it/menu_attachment_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="Chiama" name="Call"/>
<menu_item_call label="Invita al gruppo" name="Invite..."/>
<menu_item_call label="Ripristina scheletro" name="Reset Skeleton"/>
+ <menu_item_call label="Ripristina scheletro e animazioni" name="Reset Skeleton And Animations"/>
<menu_item_call label="Blocca" name="Avatar Mute"/>
<menu_item_call label="Segnala" name="abuse"/>
<menu_item_call label="Congela" name="Freeze..."/>
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 b1ca55b093..f25a289a62 100644
--- a/indra/newview/skins/default/xui/it/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/it/menu_attachment_self.xml
@@ -10,6 +10,7 @@
<menu_item_call label="Modifica la figura corporea" name="Edit My Shape"/>
<menu_item_call label="Altezza di volo" name="Hover Height"/>
<menu_item_call label="Ripristina scheletro" name="Reset Skeleton"/>
+ <menu_item_call label="Ripristina scheletro e animazioni" name="Reset Skeleton And Animations"/>
<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..."/>
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 12e808195e..f3b4075a29 100644
--- a/indra/newview/skins/default/xui/it/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/it/menu_avatar_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="Chiama" name="Call"/>
<menu_item_call label="Invita al gruppo" name="Invite..."/>
<menu_item_call label="Ripristina scheletro" name="Reset Skeleton"/>
+ <menu_item_call label="Ripristina scheletro e animazioni" name="Reset Skeleton And Animations"/>
<menu_item_call label="Blocca" name="Avatar Mute"/>
<menu_item_call label="Segnala" name="abuse"/>
<menu_item_call label="Congela" name="Freeze..."/>
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 e48449a04c..85de7f4e30 100644
--- a/indra/newview/skins/default/xui/it/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/it/menu_avatar_self.xml
@@ -27,6 +27,7 @@
<menu_item_call label="Modifica la figura corporea" name="Edit My Shape"/>
<menu_item_call label="Altezza di volo" name="Hover Height"/>
<menu_item_call label="Ripristina scheletro" name="Reset Skeleton"/>
+ <menu_item_call label="Ripristina scheletro e animazioni" name="Reset Skeleton And Animations"/>
<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..."/>
diff --git a/indra/newview/skins/default/xui/it/menu_login.xml b/indra/newview/skins/default/xui/it/menu_login.xml
index 33fa25cd38..3d2a556fe2 100644
--- a/indra/newview/skins/default/xui/it/menu_login.xml
+++ b/indra/newview/skins/default/xui/it/menu_login.xml
@@ -20,12 +20,11 @@
<menu_item_check label="Mostra menu Debug" name="Show Debug Menu"/>
<menu label="Debug" name="Debug">
<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 debug finestra contenuti Web" name="Web Content Floater Debug Test"/>
+ <menu_item_call label="Browser multimedia" name="Media Browser"/>
<menu label="Imposta livello di registrazione" name="Set Logging Level">
<menu_item_check label="Debug" name="Debug"/>
<menu_item_check label="Info" name="Info"/>
diff --git a/indra/newview/skins/default/xui/it/menu_object_icon.xml b/indra/newview/skins/default/xui/it/menu_object_icon.xml
index 9623775af4..a574757fd0 100644
--- a/indra/newview/skins/default/xui/it/menu_object_icon.xml
+++ b/indra/newview/skins/default/xui/it/menu_object_icon.xml
@@ -2,6 +2,7 @@
<menu name="Object Icon Menu">
<menu_item_call label="Profilo oggetto..." name="Object Profile"/>
<menu_item_call label="Blocca..." name="Block"/>
+ <menu_item_call label="Sblocca" name="Unblock"/>
<menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
<menu_item_call label="Teleport sul luogo dell&apos;oggetto" name="teleport_to_object"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_outfit_gear.xml b/indra/newview/skins/default/xui/it/menu_outfit_gear.xml
index 3ac0c5ce69..62c6d53e1c 100644
--- a/indra/newview/skins/default/xui/it/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_outfit_gear.xml
@@ -3,6 +3,10 @@
<menu_item_call label="Indossa - Sostituisci vestiario attuale" name="wear"/>
<menu_item_call label="Indossa - Aggiungi al vestiario attuale" name="wear_add"/>
<menu_item_call label="Togli - Rimuovi dal vestiario attuale" name="take_off"/>
+ <menu_item_call label="Carica foto (L$ 10)" name="upload_photo"/>
+ <menu_item_call label="Seleziona foto" name="select_photo"/>
+ <menu_item_call label="Scatta un&apos;istantanea" name="take_snapshot"/>
+ <menu_item_call label="Rimuovi foto" name="remove_photo"/>
<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"/>
@@ -27,4 +31,5 @@
<menu_item_call label="Chiudi tutte le cartelle" name="collapse"/>
<menu_item_call label="Cambia nome del vestiario" name="rename"/>
<menu_item_call label="Elimina vestito" name="delete_outfit"/>
+ <menu_item_check label="Ordina le cartelle sempre in base al nome" name="sort_folders_by_name"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_friends_view.xml b/indra/newview/skins/default/xui/it/menu_people_friends_view.xml
index 972e359cfe..1cfe14b86b 100644
--- a/indra/newview/skins/default/xui/it/menu_people_friends_view.xml
+++ b/indra/newview/skins/default/xui/it/menu_people_friends_view.xml
@@ -4,5 +4,6 @@
<menu_item_check label="Ordina in base allo stato" name="sort_status"/>
<menu_item_check label="Mostra le icone delle persone" name="view_icons"/>
<menu_item_check label="Mostra le autorizzazioni concesse" name="view_permissions"/>
+ <menu_item_check label="Nascondi nomi utenti" name="view_usernames"/>
<menu_item_check label="Mostra il registro conversazioni..." name="view_conversation"/>
</toggleable_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 1c09b1cfe2..3b9f9c89f8 100644
--- a/indra/newview/skins/default/xui/it/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/it/menu_people_nearby.xml
@@ -13,4 +13,6 @@
<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="Congela" name="freeze"/>
+ <menu_item_call label="Espelli" name="eject"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/it/menu_people_nearby_view.xml
index 223d88fee1..d0891903f5 100644
--- a/indra/newview/skins/default/xui/it/menu_people_nearby_view.xml
+++ b/indra/newview/skins/default/xui/it/menu_people_nearby_view.xml
@@ -5,4 +5,5 @@
<menu_item_check label="Ordina in base alla distanza" name="sort_distance"/>
<menu_item_check label="Mostra le icone delle persone" name="view_icons"/>
<menu_item_check label="Mostra mappa" name="view_map"/>
+ <menu_item_check label="Nascondi nomi utenti" name="view_usernames"/>
</toggleable_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 116b652172..67bc34a5d7 100644
--- a/indra/newview/skins/default/xui/it/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/it/menu_url_objectim.xml
@@ -2,6 +2,7 @@
<context_menu name="Url Popup">
<menu_item_call label="Profilo oggetto..." name="show_object"/>
<menu_item_call label="Blocca..." name="block_object"/>
+ <menu_item_call label="Sblocca" name="unblock_object"/>
<menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
<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"/>
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index 90ea601259..96f06d5f98 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -113,11 +113,11 @@
<menu_item_call label="Collegamento" name="Link"/>
<menu_item_call label="Scollega" name="Unlink"/>
<menu_item_check label="Modifica le parti collegate" name="Edit Linked Parts"/>
- <menu label="Seleziona parti collegate" name="Select Linked Parts">
- <menu_item_call label="Seleziona parte successiva" name="Select Next Part"/>
- <menu_item_call label="Seleziona parte precedente" name="Select Previous Part"/>
- <menu_item_call label="Includi parte successiva" name="Include Next Part"/>
- <menu_item_call label="Includi parte precedente" name="Include Previous Part"/>
+ <menu label="Seleziona elementi" name="Select Elements">
+ <menu_item_call label="Seleziona parte o faccia successiva" name="Select Next Part or Face"/>
+ <menu_item_call label="Seleziona parte o faccia precedente" name="Select Previous Part or Face"/>
+ <menu_item_call label="Includi parte o faccia successiva" name="Include Next Part or Face"/>
+ <menu_item_call label="Includi parte o faccia precedente" name="Include Previous Part or Face"/>
</menu>
<menu_item_call label="Set collegati..." name="pathfinding_linkset_menu_item"/>
<menu_item_call label="Ingrandisci selezione" name="Focus on Selection"/>
@@ -332,8 +332,7 @@
<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 multimedia" name="Web Browser Test"/>
- <menu_item_call label="Browser contenuto Web" name="Web Content Browser"/>
+ <menu_item_call label="Browser multimedia" name="Media Browser"/>
<menu_item_call label="Stampa informazioni oggetto selezionato" name="Print Selected Object Info"/>
<menu_item_check label="Debug clic" name="Debug Clicks"/>
<menu_item_check label="Debug eventi mouse" name="Debug Mouse Events"/>
diff --git a/indra/newview/skins/default/xui/it/menu_wearing_tab.xml b/indra/newview/skins/default/xui/it/menu_wearing_tab.xml
index 4a5366091f..ec375e5240 100644
--- a/indra/newview/skins/default/xui/it/menu_wearing_tab.xml
+++ b/indra/newview/skins/default/xui/it/menu_wearing_tab.xml
@@ -3,4 +3,6 @@
<menu_item_call label="Togli" name="take_off"/>
<menu_item_call label="Stacca" name="detach"/>
<menu_item_call label="Modifica vestiario" name="edit"/>
+ <menu_item_call label="Modifica" name="edit_item"/>
+ <menu_item_call label="Mostra originale" name="show_original"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/mime_types.xml b/indra/newview/skins/default/xui/it/mime_types.xml
index df119263b7..7e528b0688 100644
--- a/indra/newview/skins/default/xui/it/mime_types.xml
+++ b/indra/newview/skins/default/xui/it/mime_types.xml
@@ -22,14 +22,6 @@
Riproduci video
</playtip>
</widgetset>
- <widgetset name="none">
- <label name="none_label">
- Nessun contenuto
- </label>
- <tooltip name="none_tooltip">
- Nessun contenuto multimediale qui
- </tooltip>
- </widgetset>
<widgetset name="image">
<label name="image_label">
Immagine
@@ -52,11 +44,24 @@
Riproduci l&apos;audio di questo posto
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ Nessun contenuto
+ </label>
+ <tooltip name="none_tooltip">
+ Nessun contenuto multimediale qui
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Streaming in tempo reale
</label>
</scheme>
+ <scheme name="libvlc">
+ <label name="libvlc_label">
+ Media supportati da LibVLC
+ </label>
+ </scheme>
<mimetype name="blank">
<label name="blank_label">
- Nessuno -
@@ -127,11 +132,6 @@
Macromedia Director
</label>
</mimetype>
- <mimetype name="application/x-shockwave-flash">
- <label name="application/x-shockwave-flash_label">
- Flash
- </label>
- </mimetype>
<mimetype name="audio/mid">
<label name="audio/mid_label">
Audio (MIDI)
@@ -207,6 +207,11 @@
Video (MP4)
</label>
</mimetype>
+ <mimetype name="application/octet-stream">
+ <label name="video/octet-stream">
+ Filmato
+ </label>
+ </mimetype>
<mimetype name="video/quicktime">
<label name="video/quicktime_label">
Video (QuickTime)
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index 3a29e4d32f..3621b3bc62 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -330,6 +330,9 @@ Se non desideri che queste abilità siano assegnate a questo ruolo, disattivale
Stai per espellere [COUNT] membri dal gruppo.
<usetemplate ignoretext="Conferma l&apos;espulsione di vari partecipanti dal gruppo" name="okcancelignore" notext="Annulla" yestext="Espelli"/>
</notification>
+ <notification name="GroupBanUserOnBanlist">
+ Ad alcuni residenti non è stato inviato l&apos;invito perché espulsi dal gruppo.
+ </notification>
<notification name="AttachmentDrop">
Stai per abbandonare il tuo accessorio.
Vuoi continuare?
@@ -457,6 +460,12 @@ Per collocare il media su una sola faccia, scegli Seleziona faccia, clicca su un
<notification name="ErrorEncodingSnapshot">
Errore nella codifica della fotografia.
</notification>
+ <notification name="ErrorPhotoCannotAfford">
+ Hai bisogno di L$ [COST] per salvare una foto nel tuo inventario. Puoi acquistare L$ o salvare la foto sul tuo computer.
+ </notification>
+ <notification name="ErrorTextureCannotAfford">
+ Hai bisogno di L$ [COST] per salvare una texture nel tuo inventario. Puoi acquistare L$ o salvare la foto sul tuo computer.
+ </notification>
<notification name="ErrorUploadingPostcard">
C&apos;è stato un problema inviando la fotografia per il seguente motivo: [REASON]
</notification>
@@ -572,6 +581,10 @@ Nota: questa operazione cancellerà la cache.
Vuoi eliminare il biglietto?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
+ <notification name="LoadPreviousReportScreenshot">
+ Vuoi usare la precedente schermata per il tuo rapporto?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
Il salvataggio della Gesture è fallito.
La gesture ha troppi passi.
@@ -632,30 +645,12 @@ Visitare [_URL] per ulteriori informazioni?
</url>
<usetemplate ignoretext="L&apos;hardware di questo computer non è compatibile" name="okcancelignore" notext="No" yestext="Si"/>
</notification>
- <notification name="IntelOldDriver">
- È probabile che ci sia un driver aggiornato per il processore grafico. L&apos;aggiornamento dei driver della grafica può migliorare le prestazioni in maniera significativa.
-
- Visitare [_URL] per cercare un aggiornamento del driver?
- <url name="url">
- http://www.intel.com/p/it_IT/support/detect/graphics
- </url>
- <usetemplate ignoretext="Driver grafica obsoleto" name="okcancelignore" notext="No" yestext="Sì"/>
- </notification>
- <notification name="AMDOldDriver">
- È probabile che ci sia un driver aggiornato per il processore grafico. L&apos;aggiornamento dei driver della grafica può migliorare le prestazioni in maniera significativa.
-
- Visitare [_URL] per cercare un aggiornamento del driver?
- <url name="url">
- http://support.amd.com/it/Pages/AMDSupportHub.aspx
- </url>
- <usetemplate ignoretext="Driver grafica obsoleto" name="okcancelignore" notext="No" yestext="Sì"/>
- </notification>
- <notification name="NVIDIAOldDriver">
- È probabile che ci sia un driver aggiornato per il processore grafico. L&apos;aggiornamento dei driver della grafica può migliorare le prestazioni in maniera significativa.
+ <notification name="OldGPUDriver">
+ È probabile che ci sia un driver aggiornato per il processore grafico. L&apos;aggiornamento dei driver della grafica può migliorare le prestazioni in maniera significativa.
- Visitare [_URL] per cercare un aggiornamento del driver?
+ Visitare [URL] per cercare un aggiornamento del driver?
<url name="url">
- http://www.nvidia.it/Download/index.aspx?lang=it
+ [URL]
</url>
<usetemplate ignoretext="Driver grafica obsoleto" name="okcancelignore" notext="No" yestext="Sì"/>
</notification>
@@ -747,6 +742,9 @@ Vai su [_URL] per informazioni sull&apos;acquisto di L$?
</url>
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
+ <notification name="MuteLimitReached">
+ Impossibile aggiungere il nuovo elemento alla lista dei bloccati perché hai raggiunto il limite di [MUTE_LIMIT] immissioni.
+ </notification>
<notification name="UnableToLinkObjects">
Impossibile unire questi [COUNT] oggetti.
Puoi unire al massimo [MAX] oggetti.
@@ -1379,6 +1377,11 @@ Puoi comunque usare [SECOND_LIFE] normalmente e gli altri residenti ti vedranno
</notification>
<notification name="AgentComplexity">
La [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 complessità del tuo avatar] è [AGENT_COMPLEXITY].
+ <usetemplate ignoretext="Avvisami in caso di cambiamenti della complessità del mio avatar" name="notifyignore"/>
+ </notification>
+ <notification name="HUDComplexityWarning">
+ [HUD_REASON], è probabile che influisca negativamente sulle tue prestazioni.
+ <usetemplate ignoretext="Avvisami quando la complessità del mio HUD è eccessiva" name="notifyignore"/>
</notification>
<notification name="FirstRun">
L&apos;installazione di [APP_NAME] è terminata.
@@ -1470,6 +1473,10 @@ Scegli solo un oggetto e riprova.
Teleporta a casa tutti i residenti in questa regione?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
+ <notification name="ChangeObjectBonusFactor">
+ La riduzione del bonus oggetti dopo aver costruito in una regione può causare la restituzione o l&apos;eliminazione di oggetti. Vuoi comunque cambiare il bonus oggetti?
+ <usetemplate ignoretext="Conferma cambiamento fattore bonus oggetti" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
<notification name="EstateObjectReturn">
Confermi di voler restituire gli oggetti di proprietà di [USER_NAME] ?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
@@ -1517,6 +1524,9 @@ Eccede il [MAX_AGENTS] [LIST_TYPE] limite di [NUM_EXCESS].
<notification name="OwnerCanNotBeDenied">
Impossibile aggiungere i proprietari della proprietà immobiliare alla lista dei residenti bloccati.
</notification>
+ <notification name="ProblemAddingEstateManagerBanned">
+ Impossibile aggiungere il residente espulso alla lista dei gestori delle proprietà.
+ </notification>
<notification name="CanNotChangeAppearanceUntilLoaded">
Impossibile cambiare l&apos;aspetto fisico finchè gli abiti e i vestiti non sono caricati.
</notification>
@@ -1692,6 +1702,10 @@ Per provare le funzioni e modifiche più recenti, visita la pagina Alternate Vie
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="SystemUIScaleFactorChanged">
+ Il fattore dimensioni UI del sistema è cambiato rispetto all&apos;ultima sessione. Vuoi aprire la pagina delle impostazioni di regolazione delle dimensioni UI?
+ <usetemplate name="okcancelbuttons" 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 per gestire il mio account" name="okcancelignore" notext="Annulla" yestext="OK"/>
@@ -1731,10 +1745,17 @@ Per provare le funzioni e modifiche più recenti, visita la pagina Alternate Vie
Lasciare il gruppo?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
+ <notification name="GroupDepart">
+ Hai abbandonato il gruppo &quot;[group_name]&quot;.
+ </notification>
<notification name="OwnerCannotLeaveGroup">
Impossibile abbandonare il gruppo. Non puoi abbandonare il gruppo perché sei l&apos;ultimo proprietario del gruppo. Devi prima assegnare a un altro membro il ruolo di proprietario.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="GroupDepartError">
+ Impossibile abbandonare il gruppo.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="ConfirmKick">
Vuoi veramente espellere tutti i residenti dalla griglia?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="Espelli tutti i residenti"/>
@@ -2135,6 +2156,10 @@ Cambierà migliaia di regioni e produrrà seri problemi ai vari server.
Hai selezionato troppi prim. Seleziona non più di [MAX_PRIM_COUNT] prim e riprova
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="TooManyScriptsSelected">
+ Troppi script negli oggetti selezionati. Seleziona meno oggetti e riprova.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="ProblemImportingEstateCovenant">
Problemi nell&apos;importazione del regolamento della proprietà.
<usetemplate name="okbutton" yestext="OK"/>
@@ -2304,6 +2329,10 @@ Trasferisci gli elementi nell&apos;inventario?
Pagamento non riuscito: oggetto non trovato.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="PaymentBlockedButtonMismatch">
+ Pagamento interrotto: il prezzo pagato non corrisponde a nessuno dei pulsanti di pagamento impostati per questo oggetto.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
Non ci sono elementi in questo oggetto che tu possa copiare.
</notification>
@@ -2339,6 +2368,11 @@ Questa azione non può essere ripristinata
Questa è una selezione di grandi dimensioni con set collegati. Se viene scollegata, potrebbe non essere possibile ricollegarla. Come precauzione ti consigliamo di salvare copie dei set collegati nel tuo inventario.
<usetemplate ignoretext="Conferma per scollegare un set collegato" name="okcancelignore" notext="Annulla" yestext="Scollega"/>
</notification>
+ <notification name="HelpReportAbuseConfirm">
+ Ti ringraziamo della segnalazione.
+Esamineremo il tuo rapporto e, in caso di violazioni, prenderemo le misure appropriate.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="HelpReportAbuseSelectCategory">
Scegli una categoria per questa segnalazione di abuso.
Scegliere una categoria, ci aiuta a gestire ed elaborare le segnalazioni di abuso.
@@ -2767,6 +2801,10 @@ Qui non puoi volare.
<notification name="PathfindingDirty">
La regione ha modifiche di pathfinding in sospeso. Se hai le autorizzazioni necessarie per la costruzione puoi eseguire il rebake facendo clic sul pulsante “Rebake regione”.
</notification>
+ <notification name="PathfindingDirtyRebake">
+ La regione ha modifiche di pathfinding in sospeso. Se hai le autorizzazioni necessarie per la costruzione, puoi eseguire il rebake facendo clic sul pulsante “Rebake regione”.
+ <usetemplate name="okbutton" yestext="Rebake regione"/>
+ </notification>
<notification name="DynamicPathfindingDisabled">
Il pathfinding dinamico non è attivato in questa regione. Gli oggetti scriptati che usano chiamate LSL di pathfinding potrebbero non funzionare come previsto in questa regione.
</notification>
@@ -3273,11 +3311,13 @@ Per sicurezza, verranno bloccati per alcuni secondi.
L&apos;aspetto è stato salvato in XML su [PATH]
</notification>
<notification name="AppearanceToXMLFailed">
- L&apos;aspetto non è stato salvato in XML.
- icon=&quot;notifytip.tga&quot;
- name=&quot;PresetNotDeleted&quot;
- type=&quot;notifytip&quot;&gt;
-Errore nella cancellazione del valore predefinito [NAME].
+ Salvataggio aspetto in formato XML non riuscito.
+ </notification>
+ <notification name="PresetNotSaved">
+ Errore durante il salvataggio del valore predefinito [NAME].
+ </notification>
+ <notification name="PresetNotDeleted">
+ Errore durante l&apos;eliminazione del valore predefinito [NAME].
</notification>
<notification name="UnableToFindHelpTopic">
Impossibile trovare l&apos;argomento nell&apos;aiuto per questo elemento.
@@ -3487,13 +3527,6 @@ Clicca e trascina dovunque nel mondo per ruotare la visuale
<notification name="ForceQuitDueToLowMemory">
SL verrà interrotto tra 30 secondi a causa di spazio di memoria insufficiente.
</notification>
- <notification name="PopupAttempt">
- Non è stato possibile aprire una finestra pop-up.
- <form name="form">
- <ignore name="ignore" text="Attiva tutti i pop-up"/>
- <button name="open" text="Apri finestra pop-up"/>
- </form>
- </notification>
<notification name="SOCKS_NOT_PERMITTED">
Il proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; ha rifiutato il collegamento, che non è consentito dalle regole.
<usetemplate name="okbutton" yestext="OK"/>
@@ -3868,6 +3901,9 @@ Riprova tra un minuto.
Impossibile muovere l&apos;oggetto &apos;[OBJECT_NAME]&apos; a
[OBJ_POSITION] nella regione [REGION_NAME] perché non ci sono risorse sufficienti per l&apos;oggetto su questo lotto.
</notification>
+ <notification name="NoParcelPermsNoObject">
+ Copia non riuscita perché non hai accesso a quel lotto.
+ </notification>
<notification name="CantMoveObjectRegionVersion">
Impossibile muovere l&apos;oggetto &apos;[OBJECT_NAME]&apos; a
[OBJ_POSITION] nella regione [REGION_NAME] perché nell&apos;altra regione è in esecuzione una versione precedente che non consente la ricezione di questo oggetto attraverso i confini tra regioni.
@@ -3883,6 +3919,10 @@ Riprova tra un minuto.
<notification name="NoPermModifyObject">
Non hai l&apos;autorizzazione necessaria per modificare questa immagine
</notification>
+ <notification name="TooMuchObjectInventorySelected">
+ Selezionati troppi oggetti con tanti elementi di inventario. Seleziona meno oggetti e riprova.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CantEnablePhysObjContributesToNav">
Non è possibile attivare la fisica per un oggetto che contribuisce al navmesh.
</notification>
@@ -3919,6 +3959,12 @@ Riprova tra un minuto.
<notification name="CantSaveModifyAttachment">
Impossibile salvare i contenuti dell&apos;oggetto: Verrebbero modificate le autorizzazioni per il collegamento.
</notification>
+ <notification name="AttachmentHasTooMuchInventory">
+ Gli allegati contengono troppi elementi di inventario e non puoi aggiungerne altri.
+ </notification>
+ <notification name="IllegalAttachment">
+ Il collegamento ha richiesto un punto sull&apos;avatar che non esiste. È stato collegato al petto.
+ </notification>
<notification name="TooManyScripts">
Troppi script.
</notification>
@@ -4011,6 +4057,12 @@ Riprova tra un minuto.
<notification name="TeleportedByObjectUnknownUser">
Sei stato teleportato dall&apos;oggetto &apos;[OBJECT_NAME]&apos; di proprietà di un utente sconosciuto.
</notification>
+ <notification name="StandDeniedByObject">
+ Al momento, &quot;[OBJECT_NAME]&quot; non ti permette di stare in piedi.
+ </notification>
+ <notification name="ResitDeniedByObject">
+ Al momento, &quot;[OBJECT_NAME]&quot; non ti permette di cambiare il posto a sedere.
+ </notification>
<notification name="CantCreateObjectRegionFull">
Impossibile creare l&apos;oggetto richiesto. La regione è piena.
</notification>
@@ -4092,9 +4144,6 @@ Riprova tra un minuto.
<notification name="CantAttachNotEnoughScriptResources">
Risorse di script non sufficienti per collegare l&apos;oggetto.
</notification>
- <notification name="IllegalAttachment">
- Il collegamento ha richiesto un punto sull&apos;avatar che non esiste. È stato collegato al petto.
- </notification>
<notification name="CantDropItemTrialUser">
Non puoi lasciare oggetti qui, prova la zona Prova gratuita.
</notification>
@@ -4310,6 +4359,9 @@ Prova a selezionare un pezzo di terreno più piccolo.
<notification name="CantTransfterMoneyRegionDisabled">
Il trasferimento di denaro agli oggetti è attualmente disattivato in questa regione.
</notification>
+ <notification name="DroppedMoneyTransferRequest">
+ Impossibile effettuare il pagamento a causa del carico del sistema.
+ </notification>
<notification name="CantPayNoAgent">
Non si capisce chi deve essere pagato.
</notification>
@@ -4345,4 +4397,8 @@ Prova a selezionare un pezzo di terreno più piccolo.
Il file della cronologia del file sta ancora eseguendo l&apos;operazione precedente. Riprova nuovamente tra qualche minuto oppure chatta con un&apos;altra persona.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="OutfitPhotoLoadError">
+ [REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
</notifications>
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 c7821bc363..a19fa4eb18 100644
--- a/indra/newview/skins/default/xui/it/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/it/panel_outfits_inventory.xml
@@ -7,6 +7,7 @@
Indossa capi selezionati
</panel.string>
<tab_container name="appearance_tabs">
+ <panel label="GALLERIA VESTIARIO" name="outfit_gallery_tab"/>
<panel label="I MIEI ABITI" name="outfitslist_tab"/>
<panel label="INDOSSA" name="cof_tab"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/it/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/it/panel_outfits_wearing.xml
index 3bbf2446f5..0efed03e65 100644
--- a/indra/newview/skins/default/xui/it/panel_outfits_wearing.xml
+++ b/indra/newview/skins/default/xui/it/panel_outfits_wearing.xml
@@ -1,6 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Wearing">
+ <panel.string name="no_attachments">
+ Nessun allegato indossato.
+ </panel.string>
+ <accordion name="wearables_accordion">
+ <accordion_tab name="tab_wearables" title="Indossabili"/>
+ <accordion_tab name="tab_temp_attachments" title="Allegati temporanei"/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Mostra ulteriori opzioni"/>
+ <menu_button name="options_gear_btn" tool_tip="Mostra ulteriori opzioni"/>
</panel>
</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 093f7fc411..d34bb7c3a4 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
@@ -30,6 +30,7 @@
<combo_box.item label="Scarica e installa manualmente gli aggiornamenti" name="Install_manual"/>
</combo_box>
<check_box label="Disponibile agli aggiornamenti con versioni non rilasciate" name="update_willing_to_test"/>
+ <check_box label="Mostra note di release dopo l&apos;aggiornamento" name="update_show_release_notes"/>
<text name="Proxy Settings:">
Impostazioni proxy:
</text>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index bb2f221db9..8246f91d17 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -58,17 +58,34 @@ Scheda grafica: [GRAPHICS_CARD]
<string name="AboutDriver">
Versione driver Windows per grafica: [GRAPHICS_DRIVER_VERSION]
</string>
- <string name="AboutLibs">
+ <string name="AboutOGL">
Versione OpenGL: [OPENGL_VERSION]
-
-Versione J2C Decoder: [J2C_VERSION]
+ </string>
+ <string name="AboutSettings">
+ Dimensione finestra: [WINDOW_WIDTH] x [WINDOW_HEIGHT]
+Regolazione dimensioni carattere: [FONT_SIZE_ADJUSTMENT] punti
+Scala UI: [UI_SCALE]
+Distanza visualizzazione: [DRAW_DISTANCE] m
+Larghezza banda: [NET_BANDWITH] kbit/s
+Fattore livello di dettaglio: [LOD_FACTOR]
+Qualità di rendering: [RENDER_QUALITY] / 7
+Modello illuminazione avanzato: [GPU_SHADERS]
+Memoria texture: [TEXTURE_MEMORY] MB
+Data/ora creazione VFS (cache): [VFS_TIME]
+ </string>
+ <string name="AboutLibs">
+ Versione J2C Decoder: [J2C_VERSION]
Versione Driver audio: [AUDIO_DRIVER_VERSION]
Versione LLCEFLib/CEF: [LLCEFLIB_VERSION]
-Versione server voce: [VOICE_VERSION]
+Versione LibVLC: [LIBVLC_VERSION]
+Versione Server voice: [VOICE_VERSION]
</string>
<string name="AboutTraffic">
Pacchetti perduti: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</string>
+ <string name="AboutTime">
+ [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]
+ </string>
<string name="ErrorFetchingServerReleaseNotesURL">
Errore nel recupero URL note rilascio versione
</string>
@@ -1083,6 +1100,9 @@ Prova ad accedere nuovamente tra un minuto.
<string name="TeleportYourAgent">
Teleportarti
</string>
+ <string name="ForceSitAvatar">
+ Forza l&apos;avatar a sedersi
+ </string>
<string name="AgentNameSubst">
(Tu)
</string>
@@ -1922,6 +1942,27 @@ Prova ad accedere nuovamente tra un minuto.
<string name="av_render_anyone">
Tutte le persone vicine a te potrebbero non eseguire il tuo rendering.
</string>
+ <string name="hud_description_total">
+ Il tuo HUD
+ </string>
+ <string name="hud_name_with_joint">
+ [OBJ_NAME] (indossato su [JNT_NAME])
+ </string>
+ <string name="hud_render_memory_warning">
+ [HUD_DETAILS] fa uso di molta memoria texture
+ </string>
+ <string name="hud_render_cost_warning">
+ [HUD_DETAILS] contiene molti oggetti e texture che occupano una grande quantità di risorse
+ </string>
+ <string name="hud_render_heavy_textures_warning">
+ [HUD_DETAILS] contiene molte texture di grandi dimensioni
+ </string>
+ <string name="hud_render_cramped_warning">
+ [HUD_DETAILS] contiene troppi oggetti
+ </string>
+ <string name="hud_render_textures_warning">
+ [HUD_DETAILS] contiene troppe texture
+ </string>
<string name="AgeYearsA">
[COUNT] anno
</string>
@@ -2081,6 +2122,9 @@ Prova ad accedere nuovamente tra un minuto.
<string name="ObjectOutOfRange">
Script (oggetto fuori portata)
</string>
+ <string name="ScriptWasDeleted">
+ Script (eliminato da inventario)
+ </string>
<string name="GodToolsObjectOwnedBy">
Oggetto [OBJECT] di proprietà di [OWNER]
</string>
@@ -2651,6 +2695,15 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="Play Media">
Riproduci/Pausa supporto
</string>
+ <string name="IntelDriverPage">
+ http://www.intel.com/p/en_US/support/detect/graphics
+ </string>
+ <string name="NvidiaDriverPage">
+ http://www.nvidia.com/Download/index.aspx?lang=en-us
+ </string>
+ <string name="AMDDriverPage">
+ http://support.amd.com/us/Pages/AMDSupportHub.aspx
+ </string>
<string name="MBCmdLineError">
Un errore è stato riscontrato analizzando la linea di comando.
Per informazioni: http://wiki.secondlife.com/wiki/Client_parameters
@@ -4396,12 +4449,18 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="paid_you_ldollars">
[NAME] ti ha inviato un pagamento di L$[AMOUNT] [REASON].
</string>
+ <string name="paid_you_ldollars_gift">
+ [NAME] ti ha inviato un pagamento di L$ [AMOUNT]: [REASON]
+ </string>
<string name="paid_you_ldollars_no_reason">
[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_gift">
+ Hai inviato un pagamento di L$ [AMOUNT] a [NAME]: [REASON]
+ </string>
<string name="you_paid_ldollars_no_info">
Hai pagato L$ [AMOUNT].
</string>
@@ -4414,6 +4473,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="you_paid_failure_ldollars">
Non hai pagato [NAME] L$[AMOUNT] [REASON].
</string>
+ <string name="you_paid_failure_ldollars_gift">
+ Non hai inviato un pagamento di L$ [AMOUNT] a [NAME]: [REASON]
+ </string>
<string name="you_paid_failure_ldollars_no_info">
Non hai pagato L$ [AMOUNT].
</string>
@@ -4740,6 +4802,15 @@ Segnala abuso
<string name="texture_load_dimensions_error">
Impossibile caricare immagini di dimensioni superiori a [WIDTH]*[HEIGHT]
</string>
+ <string name="outfit_photo_load_dimensions_error">
+ Le dimensioni massime delle foto di vestiario sono [WIDTH]*[HEIGHT]. Ridimensiona l&apos;immagine o usane un&apos;altra
+ </string>
+ <string name="outfit_photo_select_dimensions_error">
+ Le dimensioni massime delle foto di vestiario sono [WIDTH]*[HEIGHT]. Seleziona un&apos;altra texture
+ </string>
+ <string name="outfit_photo_verify_dimensions_error">
+ Impossibile verificare le dimensioni della foto. Attendi che le dimensioni siano visualizzate nel selettore.
+ </string>
<string name="words_separator" value=","/>
<string name="server_is_down">
Nonostante i nostri tentativi, si è verificato un errore imprevisto.
@@ -5244,6 +5315,9 @@ Prova a racchiudere il percorso dell&apos;editor in doppie virgolette.
<string name="Command_Profile_Label">
Profilo
</string>
+ <string name="Command_Report_Abuse_Label">
+ Segnala abuso
+ </string>
<string name="Command_Search_Label">
Ricerca
</string>
@@ -5334,6 +5408,9 @@ Prova a racchiudere il percorso dell&apos;editor in doppie virgolette.
<string name="Command_Profile_Tooltip">
Modifica o visualizza il tuo profilo
</string>
+ <string name="Command_Report_Abuse_Tooltip">
+ Segnala abuso
+ </string>
<string name="Command_Search_Tooltip">
Trova luoghi, eventi, persone
</string>
diff --git a/indra/newview/skins/default/xui/ja/floater_model_preview.xml b/indra/newview/skins/default/xui/ja/floater_model_preview.xml
index 108892dd6d..c22aaaf4c4 100644
--- a/indra/newview/skins/default/xui/ja/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_model_preview.xml
@@ -245,6 +245,7 @@
</text>
<check_box label="スキンの重さを含む" name="upload_skin"/>
<check_box label="ジョイントポジションを含む" name="upload_joints"/>
+ <check_box label="ジョイント位置が定義されている場合、スケールをロック" name="lock_scale_if_joint_position"/>
<text name="pelvis_offset_label">
Z オフセット(アバターを上下調整):
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_pay.xml b/indra/newview/skins/default/xui/ja/floater_pay.xml
index 0ca0990bd4..7807fdf7b4 100644
--- a/indra/newview/skins/default/xui/ja/floater_pay.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pay.xml
@@ -1,9 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string name="payee_group">グループに支払う</string>
- <string name="payee_resident">住人に支払う</string>
- <text name="paying_text">支払中:</text>
- <text name="payee_name">非常に長い名前が途中で切れていないかをテストして確認</text>
+ <string name="payee_group">
+ グループに支払う
+ </string>
+ <string name="payee_resident">
+ 住人に支払う
+ </string>
+ <text name="paying_text">
+ 支払中:
+ </text>
+ <text name="payee_name">
+ 非常に長い名前が途中で切れていないかをテストして確認
+ </text>
+ <text name="payment_message_label">
+ 説明(任意項目):
+ </text>
<panel label="検索" name="PatternsPanel">
<button label="L$ 1 支払う" label_selected="L$ 1 支払う" name="fastpay 1"/>
<button label="L$ 5 支払う" label_selected="L$ 5 支払う" name="fastpay 5"/>
@@ -11,7 +22,9 @@
<button label="L$ 20 支払う" label_selected="L$ 20 支払う" name="fastpay 20"/>
</panel>
<panel label="検索" name="InputPanel">
- <text name="amount text">その他の金額:</text>
+ <text name="amount text">
+ その他の金額:
+ </text>
<button label="支払い" label_selected="支払い" name="pay btn"/>
<button label="取り消し" label_selected="取り消し" name="cancel btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/floater_script_queue.xml b/indra/newview/skins/default/xui/ja/floater_script_queue.xml
index 97e79fb483..de0c4469c1 100644
--- a/indra/newview/skins/default/xui/ja/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/ja/floater_script_queue.xml
@@ -15,5 +15,11 @@
<floater.string name="NotRunning">
実行されていません
</floater.string>
+ <floater.string name="Timeout">
+ タイムアウト: [OBJECT_NAME]
+ </floater.string>
+ <floater.string name="LoadingObjInv">
+ 次のインベントリをロード中: [OBJECT_NAME]
+ </floater.string>
<button label="閉じる" label_selected="閉じる" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_web_content.xml b/indra/newview/skins/default/xui/ja/floater_web_content.xml
index 48fe8aee78..d57cd4e297 100644
--- a/indra/newview/skins/default/xui/ja/floater_web_content.xml
+++ b/indra/newview/skins/default/xui/ja/floater_web_content.xml
@@ -10,5 +10,9 @@
<icon name="media_secure_lock_flag" tool_tip="安全な閲覧"/>
<button name="popexternal" tool_tip="この URL をブラウザで開く"/>
</layout_panel>
+ <layout_panel name="debug_controls">
+ <button name="web_test_home_page" tool_tip="Web テストのホームページ"/>
+ <button name="VLC Plugin Test" tool_tip="MPEG4 ビデオテスト"/>
+ </layout_panel>
</layout_stack>
</floater>
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 78c36a4392..23357ebbc2 100644
--- a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="コール" name="Call"/>
<menu_item_call label="グループに招待" name="Invite..."/>
<menu_item_call label="スケルトンをリセット" name="Reset Skeleton"/>
+ <menu_item_call label="スケルトンとアニメーションをリセット" name="Reset Skeleton And Animations"/>
<menu_item_call label="ブロック" name="Avatar Mute"/>
<menu_item_call label="報告" name="abuse"/>
<menu_item_call label="フリーズ" name="Freeze..."/>
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 ba46f91504..fa1137c7c5 100644
--- a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
@@ -10,6 +10,7 @@
<menu_item_call label="シェイプの編集" name="Edit My Shape"/>
<menu_item_call label="ホバー高さ" name="Hover Height"/>
<menu_item_call label="スケルトンをリセット" name="Reset Skeleton"/>
+ <menu_item_call label="スケルトンとアニメーションをリセット" name="Reset Skeleton And Animations"/>
<menu_item_call label="フレンド" name="Friends..."/>
<menu_item_call label="グループ" name="Groups..."/>
<menu_item_call label="プロフィール" name="Profile..."/>
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 b7e0537866..1902c9b359 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="コール" name="Call"/>
<menu_item_call label="グループに招待" name="Invite..."/>
<menu_item_call label="スケルトンをリセット" name="Reset Skeleton"/>
+ <menu_item_call label="スケルトンとアニメーションをリセット" name="Reset Skeleton And Animations"/>
<menu_item_call label="ブロック" name="Avatar Mute"/>
<menu_item_call label="報告" name="abuse"/>
<menu_item_call label="フリーズ" name="Freeze..."/>
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 a3847ed555..b0a619bcb0 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
@@ -27,6 +27,7 @@
<menu_item_call label="シェイプを編集" name="Edit My Shape"/>
<menu_item_call label="ホバー高さ" name="Hover Height"/>
<menu_item_call label="スケルトンをリセット" name="Reset Skeleton"/>
+ <menu_item_call label="スケルトンとアニメーションをリセット" name="Reset Skeleton And Animations"/>
<menu_item_call label="フレンド" name="Friends..."/>
<menu_item_call label="グループ" name="Groups..."/>
<menu_item_call label="プロフィール" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml
index abf7bce067..71f36b17be 100644
--- a/indra/newview/skins/default/xui/ja/menu_login.xml
+++ b/indra/newview/skins/default/xui/ja/menu_login.xml
@@ -20,13 +20,12 @@
<menu_item_check label="デバッグメニューを表示する" name="Show Debug Menu"/>
<menu label="デバッグ" name="Debug">
<menu_item_call label="デバッグ設定を表示" name="Debug Settings"/>
- <menu_item_call label="UI/色の設定" name="UI/Color Settings"/>
<menu_item_call label="XUI プレビューツール" name="UI Preview Tool"/>
<menu label="UI テスト" name="UI Tests"/>
<menu_item_call label="ウィンドウのサイズを設定..." name="Set Window Size..."/>
<menu_item_call label="利用規約を表示" name="TOS"/>
<menu_item_call label="クリティカルメッセージを表示" name="Critical"/>
- <menu_item_call label="Web コンテンツフローターのデバッグテスト" name="Web Content Floater Debug Test"/>
+ <menu_item_call label="メディアブラウザ" name="Media Browser"/>
<menu label="ログレベルを設定" name="Set Logging Level">
<menu_item_check label="デバッグ" name="Debug"/>
<menu_item_check label="情報" name="Info"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_object_icon.xml b/indra/newview/skins/default/xui/ja/menu_object_icon.xml
index 6448e9244e..7b55a64eef 100644
--- a/indra/newview/skins/default/xui/ja/menu_object_icon.xml
+++ b/indra/newview/skins/default/xui/ja/menu_object_icon.xml
@@ -2,6 +2,7 @@
<menu name="Object Icon Menu">
<menu_item_call label="オブジェクトのプロフィール..." name="Object Profile"/>
<menu_item_call label="ブロック..." name="Block"/>
+ <menu_item_call label="ブロック解除" name="Unblock"/>
<menu_item_call label="地図に表示" name="show_on_map"/>
<menu_item_call label="オブジェクトの場所にテレポート" name="teleport_to_object"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml
index 1969ae2a10..5e02fd3b8f 100644
--- a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml
@@ -3,6 +3,10 @@
<menu_item_call label="着る - 着用中のアウトフィットを入れ替える" name="wear"/>
<menu_item_call label="着る - 着用中のアウトフィットに追加する" name="wear_add"/>
<menu_item_call label="取り外す - 着用中のアウトフィットから取り除く" name="take_off"/>
+ <menu_item_call label="写真をアップロード(L$10)" name="upload_photo"/>
+ <menu_item_call label="写真を選択" name="select_photo"/>
+ <menu_item_call label="スナップショットを撮る" name="take_snapshot"/>
+ <menu_item_call label="写真を削除" name="remove_photo"/>
<menu label="衣類" name="New Clothes">
<menu_item_call label="シャツ" name="New Shirt"/>
<menu_item_call label="パンツ" name="New Pants"/>
@@ -27,4 +31,5 @@
<menu_item_call label="フォルダをすべて閉じる" name="collapse"/>
<menu_item_call label="アウトフィットの名前を変更する" name="rename"/>
<menu_item_call label="アウトフィットを削除する" name="delete_outfit"/>
+ <menu_item_check label="フォルダを常に名前順に並べる" name="sort_folders_by_name"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml b/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml
index b95d11fdbd..f290bec652 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml
@@ -4,5 +4,6 @@
<menu_item_check label="オンライン状況で並べ替え" name="sort_status"/>
<menu_item_check label="人のアイコン表示" name="view_icons"/>
<menu_item_check label="与えられた権限を表示" name="view_permissions"/>
+ <menu_item_check label="ユーザー名を非表示" name="view_usernames"/>
<menu_item_check label="会話ログを表示..." name="view_conversation"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml
index 972ab767bf..87f1d26ca4 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml
@@ -13,4 +13,6 @@
<menu_item_call label="共有" name="share"/>
<menu_item_call label="支払い" name="pay"/>
<menu_item_check label="ブロック・ブロック解除" name="block_unblock"/>
+ <menu_item_call label="フリーズ" name="freeze"/>
+ <menu_item_call label="追放" name="eject"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml
index b7cccc4396..9330a8e484 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml
@@ -5,4 +5,5 @@
<menu_item_check label="距離で並べ替え" name="sort_distance"/>
<menu_item_check label="人のアイコン表示" name="view_icons"/>
<menu_item_check label="地図を表示" name="view_map"/>
+ <menu_item_check label="ユーザー名を非表示" name="view_usernames"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml
index a02ca8415d..96f8b3f7b1 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml
@@ -2,6 +2,7 @@
<context_menu name="Url Popup">
<menu_item_call label="オブジェクトのプロフィール..." name="show_object"/>
<menu_item_call label="ブロック..." name="block_object"/>
+ <menu_item_call label="ブロック解除" name="unblock_object"/>
<menu_item_call label="地図に表示" name="show_on_map"/>
<menu_item_call label="オブジェクトの場所にテレポート" name="teleport_to_object"/>
<menu_item_call label="オブジェクト名をクリップボードにコピー" name="url_copy_label"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index c2ae77bef2..e0834eb12d 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -113,11 +113,11 @@
<menu_item_call label="リンク" name="Link"/>
<menu_item_call label="リンクを外す" name="Unlink"/>
<menu_item_check label="リンクした部分を編集" name="Edit Linked Parts"/>
- <menu label="リンクした部分を選択する" name="Select Linked Parts">
- <menu_item_call label="次の部分を選択する" name="Select Next Part"/>
- <menu_item_call label="前回の部分を選択する" name="Select Previous Part"/>
- <menu_item_call label="次の部分を含める" name="Include Next Part"/>
- <menu_item_call label="前回の部分を含める" name="Include Previous Part"/>
+ <menu label="要素を選択" name="Select Elements">
+ <menu_item_call label="次のパーツまたは面を選択" name="Select Next Part or Face"/>
+ <menu_item_call label="前のパーツまたは面を選択" name="Select Previous Part or Face"/>
+ <menu_item_call label="次のパーツまたは面を含める" name="Include Next Part or Face"/>
+ <menu_item_call label="前のパーツまたは面を含める" name="Include Previous Part or Face"/>
</menu>
<menu_item_call label="リンクセット..." name="pathfinding_linkset_menu_item"/>
<menu_item_call label="選択したものに焦点を合わせる" name="Focus on Selection"/>
@@ -368,8 +368,7 @@
<menu_item_call label="リージョンオブジェクトのキャッシュをダンプ" name="Dump Region Object Cache"/>
</menu>
<menu label="UI" name="UI">
- <menu_item_call label="メディアブラウザのテスト" name="Web Browser Test"/>
- <menu_item_call label="Web コンテンツブラウザ" name="Web Content Browser"/>
+ <menu_item_call label="メディアブラウザ" name="Media Browser"/>
<menu_item_call label="SelectMgr をダンプ" name="Dump SelectMgr"/>
<menu_item_call label="インベントリの出力" name="Dump Inventory"/>
<menu_item_call label="タイマーをダンプ" name="Dump Timers"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml b/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml
index 9effed1f42..bf8e72e457 100644
--- a/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml
+++ b/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml
@@ -3,4 +3,6 @@
<menu_item_call label="取り外す" name="take_off"/>
<menu_item_call label="取り外す" name="detach"/>
<menu_item_call label="アウトフットの編集" name="edit"/>
+ <menu_item_call label="編集" name="edit_item"/>
+ <menu_item_call label="オリジナルを表示" name="show_original"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/mime_types.xml b/indra/newview/skins/default/xui/ja/mime_types.xml
index bfc8d0b724..6de9244b40 100644
--- a/indra/newview/skins/default/xui/ja/mime_types.xml
+++ b/indra/newview/skins/default/xui/ja/mime_types.xml
@@ -22,14 +22,6 @@
ムービー再生
</playtip>
</widgetset>
- <widgetset name="none">
- <label name="none_label">
- コンテンツなし
- </label>
- <tooltip name="none_tooltip">
- ここにメディアなし
- </tooltip>
- </widgetset>
<widgetset name="image">
<label name="image_label">
画像
@@ -52,11 +44,24 @@
ここのオーディオを再生する
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ コンテンツなし
+ </label>
+ <tooltip name="none_tooltip">
+ ここにメディアなし
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
リアルタイム・ストリーミング
</label>
</scheme>
+ <scheme name="libvlc">
+ <label name="libvlc_label">
+ LibVLC 対応メディア
+ </label>
+ </scheme>
<mimetype name="blank">
<label name="blank_label">
-- なし --
@@ -127,11 +132,6 @@
Macromedia Director
</label>
</mimetype>
- <mimetype name="application/x-shockwave-flash">
- <label name="application/x-shockwave-flash_label">
- Flash
- </label>
- </mimetype>
<mimetype name="audio/mid">
<label name="audio/mid_label">
オーディオ (MIDI)
@@ -207,6 +207,11 @@
ムービー (MP4)
</label>
</mimetype>
+ <mimetype name="application/octet-stream">
+ <label name="video/octet-stream">
+ ムービー
+ </label>
+ </mimetype>
<mimetype menu="1" name="video/quicktime">
<label name="video/quicktime_label">
ムービー (QuickTime)
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index 54e5f29621..00d9b3ca5c 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -337,6 +337,9 @@
[COUNT] 名のメンバーをグループから追放しようとしています。
<usetemplate ignoretext="グループからの複数のメンバーの追放を確認します" name="okcancelignore" notext="取り消し" yestext="禁止"/>
</notification>
+ <notification name="GroupBanUserOnBanlist">
+ 一部の住人がグループから追放されたため、招待状が送られませんでした。
+ </notification>
<notification name="AttachmentDrop">
アタッチメントを下に置こうとしています。
続けますか?
@@ -475,6 +478,12 @@ L$ が不足しているのでこのグループに参加することができ
<notification name="ErrorEncodingSnapshot">
スナップショットのエンコード化でエラーが出ました!
</notification>
+ <notification name="ErrorPhotoCannotAfford">
+ インベントリに写真を保存するには L$[COST] が必要です。L$ を購入するか、代わりに写真をっコンピュータに保存できます。
+ </notification>
+ <notification name="ErrorTextureCannotAfford">
+ インベントリにテクスチャを保存するには L$[COST] が必要です。L$ を購入するか、代わりに写真をコンピュータに保存できます。
+ </notification>
<notification name="ErrorUploadingPostcard">
次の理由で、スナップショットの送信時に問題が起こりました: [REASON]
</notification>
@@ -593,6 +602,10 @@ L$ が不足しているのでこのグループに参加することができ
ノートカードを削除しますか?
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
</notification>
+ <notification name="LoadPreviousReportScreenshot">
+ 以前のスクリーンショットをレポートに使用しますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
ジェスチャーの保存に失敗しました。
ステップが多すぎます。
@@ -653,32 +666,14 @@ L$ が不足しているのでこのグループに参加することができ
</url>
<usetemplate ignoretext="使用中のコンピューターのハードウェアがサポートされていないとき" name="okcancelignore" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="IntelOldDriver">
- おそらくお使いのグラフィックチップ用の新しいドライバが入手可能です。グラフィックドライバを更新することにより、パフォーマンスが大幅に向上する場合があります。
-
-[_URL] にアクセスして更新版のドライバがあるかどうかを確認しますか?
- <url name="url">
- http://www.intel.com/p/ja_JP/support/detect/graphics
- </url>
- <usetemplate ignoretext="使用しているグラフィックドライバが古い場合" name="okcancelignore" notext="いいえ" yestext="はい"/>
- </notification>
- <notification name="AMDOldDriver">
- お使いのグラフィックチップには最新のドライバが存在するようです。グラフィックドライバを更新すると、パフォーマンスが大幅に改善されます。
-
-[_URL] へアクセスして、ドライバーを更新しますか。
- <url name="url">
- http://support.amd.com/us/Pages/AMDSupportHub.aspx
- </url>
- <usetemplate ignoretext="自分のグラフィックドライバが旧くなりました。" name="okcancelignore" notext="いいえ" yestext="はい"/>
- </notification>
- <notification name="NVIDIAOldDriver">
- お使いのグラフィックチップには最新のドライバが存在するようです。グラフィックドライバを更新すると、パフォーマンスが大幅に改善されます。
+ <notification name="OldGPUDriver">
+ グラフィックスチップに最新のドライバがある可能性があります。グラフィックドライバを更新することにより、大幅にパフォーマンスが向上します。
-[_URL] へアクセスして、ドライバーを更新しますか。
+ ドライバの更新を確認するために [URL] にアクセスしますか?
<url name="url">
- http://www.nvidia.com/Download/index.aspx?lang=en-us
+ [URL]
</url>
- <usetemplate ignoretext="自分のグラフィックドライバが旧くなりました。" name="okcancelignore" notext="いいえ" yestext="はい"/>
+ <usetemplate ignoretext="使用中のグラフィックドライバが古くなっています" name="okcancelignore" notext="いいえ" yestext="はい"/>
</notification>
<notification name="UnknownGPU">
お使いのシステムには、[APP_NAME] が認識できないグラフィックカードが搭載されています。
@@ -767,6 +762,9 @@ L$ が不足しているのでこのグループに参加することができ
</url>
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
</notification>
+ <notification name="MuteLimitReached">
+ [MUTE_LIMIT] エントリの制限に達したため、ブロックリストに新しいエントリを追加できません。
+ </notification>
<notification name="UnableToLinkObjects">
[COUNT] 個のオブジェクトをリンクできません。
リンクできるのは最大 [MAX] 個です。
@@ -1408,6 +1406,11 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries を参照してく
</notification>
<notification name="AgentComplexity">
あなたの [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 avatar complexity] は [AGENT_COMPLEXITY] です。
+ <usetemplate ignoretext="アバターの複雑さの変更について警告する" name="notifyignore"/>
+ </notification>
+ <notification name="HUDComplexityWarning">
+ [HUD_REASON]、パフォーマンスに悪影響を与える恐れがあります。
+ <usetemplate ignoretext="HUD が複雑すぎる場合はお知らせください" name="notifyignore"/>
</notification>
<notification name="FirstRun">
[APP_NAME] のインストールが完了しました。
@@ -1501,6 +1504,10 @@ SHA1 フィンガープリント: [MD5_DIGEST]
このリージョンにいる全ての住人をホームにテレポートしますか?
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
</notification>
+ <notification name="ChangeObjectBonusFactor">
+ 地域(リージョン)内でビルドが確立された後にオブジェクトボーナスを下げると、オブジェクトが返されたり、削除されたりします。本当にオブジェクトボーナスを変更しますか?
+ <usetemplate ignoretext="オブジェクトボーナス係数の変更を確認" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ </notification>
<notification name="EstateObjectReturn">
[USER_NAME] が所有しているオブジェクトを返却しますか?
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
@@ -1549,6 +1556,9 @@ SHA1 フィンガープリント: [MD5_DIGEST]
<notification name="OwnerCanNotBeDenied">
不動産オーナーを不動産の「禁止住人」リストに追加できません。
</notification>
+ <notification name="ProblemAddingEstateManagerBanned">
+ 追放された住人を不動産管理者リストに追加できません。
+ </notification>
<notification name="CanNotChangeAppearanceUntilLoaded">
衣類およびシェイプが読み込まれるまでは、容姿の変更はできません。
</notification>
@@ -1720,6 +1730,10 @@ http://secondlife.com/download から最新バージョンをダウンロード
Web ブラウザを開いてこのコンテンツを表示しますか?
<usetemplate ignoretext="ブラウザを起動して Web ページを見るとき" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
+ <notification name="SystemUIScaleFactorChanged">
+ 前回実行時からシステム UI サイズ係数が変更されています。UI サイズ調整設定ページを開きますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
<notification name="WebLaunchJoinNow">
[http://jp.secondlife.com/account/ マイアカウント] ページに移動してアカウントを管理しますか?
<usetemplate ignoretext="ブラウザを起動してアカウントを管理するとき" name="okcancelignore" notext="取り消し" yestext="OK"/>
@@ -1761,10 +1775,17 @@ http://secondlife.com/download から最新バージョンをダウンロード
グループから脱退しますか?
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
</notification>
+ <notification name="GroupDepart">
+ グループ &apos;[group_name]&apos; を抜けました。
+ </notification>
<notification name="OwnerCannotLeaveGroup">
グループを抜けることができません。グループの最後のオーナーであるため、グループを抜けることができません。最初に、別のメンバーをオーナーの役割に割り当ててください。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="GroupDepartError">
+ グループを抜けることができません。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="ConfirmKick">
本当に住人全員をグリッドから追い出しますか?
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="住人全員を追い出す"/>
@@ -2165,6 +2186,10 @@ http://wiki.secondlife.com/wiki/Setting_your_display_name を参照してくだ
選択したプリムが多すぎます。 [MAX_PRIM_COUNT] 個選択するか、プリム数を減らしてもう一度お試しください。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="TooManyScriptsSelected">
+ スクリプト内で選択されたオブジェクトが多すぎます。選択するオブジェクトを減らして、もう一度やり直してください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="ProblemImportingEstateCovenant">
不動産約款のインポート時に問題が発生しました。
<usetemplate name="okbutton" yestext="OK"/>
@@ -2337,6 +2362,10 @@ L$ [AMOUNT] で、このクラシファイド広告を今すぐ公開します
支払いが失敗しました: オブジェクトが見つかりませんでした。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="PaymentBlockedButtonMismatch">
+ 支払いが停止されました: 支払われた価格がこのオブジェクトに設定された支払いボタンのどれとも一致しません。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
このオブジェクトには、あなたがコピーできるアイテムはありません。
</notification>
@@ -2372,6 +2401,12 @@ L$ [AMOUNT] で、このクラシファイド広告を今すぐ公開します
これは、リンクセットによる広範囲の選択です。リンクを解除すると、もう一度リンクできなくなる可能性があります。そのような場合に備えて、リンクセットを自分の持ち物にコピーできます。
<usetemplate ignoretext="リンクセットのリンクを解除するときに確認する" name="okcancelignore" notext="取り消し" yestext="リンクを外す"/>
</notification>
+ <notification name="HelpReportAbuseConfirm">
+ この問題のご報告にお時間を割いていただきありがとうございます。
+お知らせいただいた内容について違反がないか確認し、適切に
+対処いたします。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="HelpReportAbuseSelectCategory">
嫌がらせ報告のカテゴリを選択してください。
カテゴリを選択することにより、嫌がらせ報告の処理や保管に大変役立ちます。
@@ -2806,6 +2841,10 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
<notification name="PathfindingDirty">
この値域(リージョン)には、保留中のパスファインディングの変更があります。制作権がある場合は、「地域の再構築」ボタンをクリックして、地域(リージョン)を再構築できます。
</notification>
+ <notification name="PathfindingDirtyRebake">
+ この値域(リージョン)には、保留中のパスファインディングの変更があります。制作権がある場合は、「地域の再構築」ボタンをクリックして、地域(リージョン)を再構築できます。
+ <usetemplate name="okbutton" yestext="地域の再構築"/>
+ </notification>
<notification name="DynamicPathfindingDisabled">
この地域(リージョン)でダイナミックパスファインディングが有効になっていません。パスファインディング LSL 呼び出しを使用するスクリプト化されたオブジェクトがこの地域(リージョン)では動作できません。
</notification>
@@ -3310,10 +3349,12 @@ M キーを押して変更します。
</notification>
<notification name="AppearanceToXMLFailed">
外観を XML に保存できませんでした。
- icon=&quot;notifytip.tga&quot;
- name=&quot;PresetNotDeleted&quot;
- type=&quot;notifytip&quot;&gt;
-プリセット [NAME] の削除エラー。
+ </notification>
+ <notification name="PresetNotSaved">
+ プリセット [NAME] の保存エラー。
+ </notification>
+ <notification name="PresetNotDeleted">
+ プリセット [NAME] の削除エラー。
</notification>
<notification name="UnableToFindHelpTopic">
ヘルプトピックが見つかりませんでした。
@@ -3523,13 +3564,6 @@ M キーを押して変更します。
<notification name="ForceQuitDueToLowMemory">
メモリ不足のため 30 秒以内に SL は終了します。
</notification>
- <notification name="PopupAttempt">
- ポップアップがブロックされました。
- <form name="form">
- <ignore name="ignore" text="全てのポップアップを有効にする"/>
- <button name="open" text="ポップアップウィンドウを開く"/>
- </form>
- </notification>
<notification name="SOCKS_NOT_PERMITTED">
ルールセットによって許可されていないため、SOCKS 5 プロキシ &quot;[HOST]:[PORT]&quot; が接続を拒絶しました。
<usetemplate name="okbutton" yestext="OK"/>
@@ -3900,6 +3934,9 @@ M キーを押して変更します。
<notification name="CantMoveObjectParcelResources">
この区画でこのオブジェクトのリソースが不足しているため、オブジェクト &apos;[OBJECT_NAME]&apos; をリージョン [REGION_NAME] 内の [OBJ_POSITION] に移動できません。
</notification>
+ <notification name="NoParcelPermsNoObject">
+ その区画へのアクセス権がないため、コピーが失敗しました。
+ </notification>
<notification name="CantMoveObjectRegionVersion">
オブジェクト &apos;[OBJECT_NAME]&apos; をリージョン [REGION_NAME] 内の [OBJ_POSITION] に移動することはできません。他のリージョンでは、リージョンの境界をまたいだこのオブジェクトを受信することができない古いバージョンを実行しているためです。
</notification>
@@ -3913,6 +3950,10 @@ M キーを押して変更します。
<notification name="NoPermModifyObject">
そのオブジェクトを変更する権限がありません
</notification>
+ <notification name="TooMuchObjectInventorySelected">
+ 大きなインベントリを持つオブジェクトの選択が多すぎます。選択するオブジェクトを減らして、もう一度やり直してください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CantEnablePhysObjContributesToNav">
ナビメッシュに貢献するオブジェクトに対して物理を有効にできません。
</notification>
@@ -3949,6 +3990,12 @@ M キーを押して変更します。
<notification name="CantSaveModifyAttachment">
オブジェクトのコンテンツに保存できません。このため、アタッチメントの権限が変更されます。
</notification>
+ <notification name="AttachmentHasTooMuchInventory">
+ ご使用のアタッチメントに含まれるインベントリが多すぎるため、インベントリを追加できません。
+ </notification>
+ <notification name="IllegalAttachment">
+ 添付ファイルはアバターの存在しない点を要求しました。代わりに胸に添付されていました。
+ </notification>
<notification name="TooManyScripts">
スクリプトが多すぎます。
</notification>
@@ -4041,6 +4088,12 @@ M キーを押して変更します。
<notification name="TeleportedByObjectUnknownUser">
不明なユーザーが所有しているオブジェクト &apos;[OBJECT_NAME]&apos; によって、あなたはテレポートされています。
</notification>
+ <notification name="StandDeniedByObject">
+ &apos;[OBJECT_NAME]&apos; はこの時点であなたが立つことを許可しません。
+ </notification>
+ <notification name="ResitDeniedByObject">
+ &apos;[OBJECT_NAME]&apos; はこの時点であなたが席を変更することを許可しません。
+ </notification>
<notification name="CantCreateObjectRegionFull">
リクエストされたオブジェクトを作成できません。リージョンが埋まっています。
</notification>
@@ -4122,9 +4175,6 @@ M キーを押して変更します。
<notification name="CantAttachNotEnoughScriptResources">
オブジェクトの着用に使用できるスクリプトリソースが足りません。
</notification>
- <notification name="IllegalAttachment">
- 添付ファイルはアバターの存在しない点を要求しました。代わりに胸に添付されていました。
- </notification>
<notification name="CantDropItemTrialUser">
オブジェクトをここにドロップできません。フリートライアル領域をお試しください。
</notification>
@@ -4340,6 +4390,9 @@ M キーを押して変更します。
<notification name="CantTransfterMoneyRegionDisabled">
オブジェクトへの送金は、このリージョンでは現在無効にされています。
</notification>
+ <notification name="DroppedMoneyTransferRequest">
+ システムロードにより、支払いを実行できません。
+ </notification>
<notification name="CantPayNoAgent">
支払いの相手を把握できませんでした。
</notification>
@@ -4375,4 +4428,8 @@ M キーを押して変更します。
チャット履歴ファイルが前の操作でビジーです。2、3 分経ってからもう一度試すか、別の人とのチャットを選択してください。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="OutfitPhotoLoadError">
+ [REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
</notifications>
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 93df0ba2bd..8633bfb2ad 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfits_inventory.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="もの" name="Outfits">
<panel.string name="wear_outfit_tooltip">
選択したアウトフィットを着用する
@@ -7,6 +7,7 @@
選択したアイテムを着用
</panel.string>
<tab_container name="appearance_tabs">
+ <panel label="アウトフィットギャラリー" name="outfit_gallery_tab"/>
<panel label="マイ アウトフィット" name="outfitslist_tab"/>
<panel label="着用中" name="cof_tab"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/ja/panel_outfits_wearing.xml
index fd03e6b89e..a6fbaae58d 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfits_wearing.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfits_wearing.xml
@@ -1,6 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Wearing">
+ <panel.string name="no_attachments">
+ 着用しているアタッチメントはありません。
+ </panel.string>
+ <accordion name="wearables_accordion">
+ <accordion_tab name="tab_wearables" title="着用物"/>
+ <accordion_tab name="tab_temp_attachments" title="一時的なアタッチメント"/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="オプションを表示します"/>
+ <menu_button name="options_gear_btn" tool_tip="オプションを表示します"/>
</panel>
</panel>
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 be823938a2..4c40ba7f7b 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
@@ -30,6 +30,7 @@
<combo_box.item label="更新を手動でダウンロードしてインストールします" name="Install_manual"/>
</combo_box>
<check_box label="release candidate にアップグレードします" name="update_willing_to_test"/>
+ <check_box label="更新後にリリースノートを表示する" name="update_show_release_notes"/>
<text name="Proxy Settings:">
プロキシ設定:
</text>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 904ce3880a..586b8ab2d3 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -61,17 +61,34 @@ OS バージョン:[OS_VERSION]
<string name="AboutDriver">
Windows グラフィックドライババージョン:[GRAPHICS_DRIVER_VERSION]
</string>
- <string name="AboutLibs">
+ <string name="AboutOGL">
OpenGL バージョン:[OPENGL_VERSION]
-
-J2C デコーダバージョン:[J2C_VERSION]
+ </string>
+ <string name="AboutSettings">
+ ウィンドウサイズ: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
+フォントサイズの調整: [FONT_SIZE_ADJUSTMENT]pt
+UI スケーリング: [UI_SCALE]
+描画距離:[DRAW_DISTANCE]m
+帯域幅:[NET_BANDWITH]kbit/s
+LOD 係数: [LOD_FACTOR]
+表示品質: [RENDER_QUALITY] / 7
+高度なライティングモデル: [GPU_SHADERS]
+テクスチャメモリ: [TEXTURE_MEMORY]MB
+VFS(キャッシュ)作成時間: [VFS_TIME]
+ </string>
+ <string name="AboutLibs">
+ J2C デコーダバージョン:[J2C_VERSION]
オーディオドライババージョン:[AUDIO_DRIVER_VERSION]
-LLCEFLib/CEF バージョン: [LLCEFLIB_VERSION]
-ボイスサーバーバージョン:[VOICE_VERSION]
+LLCEFLib/CEF バージョン: [LLCEFLIB_VERSION]
+LibVLC バージョン: [LIBVLC_VERSION]
+ボイスサーバーバージョン:[VOICE_VERSION]
</string>
<string name="AboutTraffic">
パケットロス:[PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</string>
+ <string name="AboutTime">
+ [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]
+ </string>
<string name="ErrorFetchingServerReleaseNotesURL">
サーバーのリリースノートの URL を取得中にエラーが発生しました。
</string>
@@ -1089,6 +1106,9 @@ support@secondlife.com にお問い合わせください。
<string name="TeleportYourAgent">
あなたをテレポート
</string>
+ <string name="ForceSitAvatar">
+ アバターを強制的に座らせる
+ </string>
<string name="NotConnected">
接続されていません
</string>
@@ -1937,6 +1957,27 @@ support@secondlife.com にお問い合わせください。
<string name="av_render_anyone">
あなたのまわりの誰にもあなたが見えない可能性があります。
</string>
+ <string name="hud_description_total">
+ ご利用の HUD
+ </string>
+ <string name="hud_name_with_joint">
+ [OBJ_NAME]([JNT_NAME] に装着中)
+ </string>
+ <string name="hud_render_memory_warning">
+ [HUD_DETAILS] はたくさんのテクスチャメモリを使用します
+ </string>
+ <string name="hud_render_cost_warning">
+ [HUD_DETAILS] には高価なオブジェクトやテクスチャがたくさん含まれています
+ </string>
+ <string name="hud_render_heavy_textures_warning">
+ [HUD_DETAILS] は大きなテクスチャがたくさん含まれています
+ </string>
+ <string name="hud_render_cramped_warning">
+ [HUD_DETAILS] に含まれるオブジェクトが多すぎます
+ </string>
+ <string name="hud_render_textures_warning">
+ [HUD_DETAILS] に含まれるテクスチャが多すぎます
+ </string>
<string name="AgeYearsA">
[COUNT] 年
</string>
@@ -2096,6 +2137,9 @@ support@secondlife.com にお問い合わせください。
<string name="ObjectOutOfRange">
スクリプト(オブジェクトが範囲外にあります)
</string>
+ <string name="ScriptWasDeleted">
+ スクリプト(インベントリから削除済み)
+ </string>
<string name="GodToolsObjectOwnedBy">
[OWNER] 所有のオブジェクト「[OBJECT]」
</string>
@@ -2708,6 +2752,15 @@ support@secondlife.com にお問い合わせください。
<string name="Play Media">
メディアを再生/一時停止
</string>
+ <string name="IntelDriverPage">
+ http://www.intel.com/p/en_US/support/detect/graphics
+ </string>
+ <string name="NvidiaDriverPage">
+ http://www.nvidia.com/Download/index.aspx?lang=en-us
+ </string>
+ <string name="AMDDriverPage">
+ http://support.amd.com/us/Pages/AMDSupportHub.aspx
+ </string>
<string name="MBCmdLineError">
コマンドラインにエラーが見つかりました。
リンク先を参照してください: http://wiki.secondlife.com/wiki/Client_parameters
@@ -4483,12 +4536,18 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="paid_you_ldollars">
[NAME] は [REASON] のために L$[AMOUNT] を支払いました。
</string>
+ <string name="paid_you_ldollars_gift">
+ [NAME] は L$[AMOUNT] 支払いました:[REASON]
+ </string>
<string name="paid_you_ldollars_no_reason">
[NAME] は L$[AMOUNT] を支払いました。
</string>
<string name="you_paid_ldollars">
[NAME] に L$ [AMOUNT] を支払いました:[REASON]
</string>
+ <string name="you_paid_ldollars_gift">
+ [NAME] に L$ [AMOUNT] を支払いました:[REASON]
+ </string>
<string name="you_paid_ldollars_no_info">
L$ [AMOUNT] を支払いました。
</string>
@@ -4501,6 +4560,9 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="you_paid_failure_ldollars">
[NAME] に [REASON] の代金 L$ [AMOUNT] を支払えませんでした。
</string>
+ <string name="you_paid_failure_ldollars_gift">
+ [NAME] に L$ [AMOUNT] を支払えませんでした:[REASON]
+ </string>
<string name="you_paid_failure_ldollars_no_info">
L$ [AMOUNT] を支払えませんでした。
</string>
@@ -4827,6 +4889,15 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="texture_load_dimensions_error">
[WIDTH]*[HEIGHT] 以上の画像は読み込めません
</string>
+ <string name="outfit_photo_load_dimensions_error">
+ 最大アウトフィット写真サイズは [WIDTH]*[HEIGHT] です。画像のサイズを調整するか、別の画像を使用してください
+ </string>
+ <string name="outfit_photo_select_dimensions_error">
+ 最大アウトフィット写真サイズは [WIDTH]*[HEIGHT] です。別のテクスチャを選択してください
+ </string>
+ <string name="outfit_photo_verify_dimensions_error">
+ 写真の寸法を確認できません。写真サイズがピッカーに表示されるまでお待ちください
+ </string>
<string name="words_separator" value=","/>
<string name="server_is_down">
大変申し訳ございませんが、予期しない問題が発生しました。
@@ -5331,6 +5402,9 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="Command_Profile_Label">
プロフィール
</string>
+ <string name="Command_Report_Abuse_Label">
+ 嫌がらせの報告
+ </string>
<string name="Command_Search_Label">
検索
</string>
@@ -5421,6 +5495,9 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="Command_Profile_Tooltip">
プロフィールを編集・表示
</string>
+ <string name="Command_Report_Abuse_Tooltip">
+ 嫌がらせの報告
+ </string>
<string name="Command_Search_Tooltip">
場所、イベント、人を検索
</string>
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index dd85f1eb9b..e9dd18043d 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -44,6 +44,7 @@ Wersja OpenGL: [OPENGL_VERSION]
Wersja dekodera J2C: [J2C_VERSION]
Wersja sterownika dźwięku (Audio Driver): [AUDIO_DRIVER_VERSION]
Wersja LLCEFLib/CEF: [LLCEFLIB_VERSION]
+Wersja LibVLC: [LIBVLC_VERSION]
Wersja serwera głosu (Voice Server): [VOICE_VERSION]
</string>
<string name="AboutTraffic">
diff --git a/indra/newview/skins/default/xui/pt/floater_model_preview.xml b/indra/newview/skins/default/xui/pt/floater_model_preview.xml
index 35cee93ad1..70ba647d30 100644
--- a/indra/newview/skins/default/xui/pt/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_model_preview.xml
@@ -245,6 +245,7 @@
</text>
<check_box label="Incluir peso da pele" name="upload_skin"/>
<check_box label="Incluir posições de junções" name="upload_joints"/>
+ <check_box label="Travar escala se posição de articulação estiver definida" name="lock_scale_if_joint_position"/>
<text name="pelvis_offset_label">
Desvio Z (subir ou baixar avatar):
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_pay.xml b/indra/newview/skins/default/xui/pt/floater_pay.xml
index 77e814b575..21cb91dc96 100644
--- a/indra/newview/skins/default/xui/pt/floater_pay.xml
+++ b/indra/newview/skins/default/xui/pt/floater_pay.xml
@@ -1,9 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <string name="payee_group">Pagar grupo</string>
- <string name="payee_resident">Pagar residente</string>
- <text name="paying_text">Você está pagando:</text>
- <text name="payee_name">Test Name That Is Extremely Long To Check Clipping</text>
+ <string name="payee_group">
+ Pagar grupo
+ </string>
+ <string name="payee_resident">
+ Pagar residente
+ </string>
+ <text name="paying_text">
+ Você está pagando:
+ </text>
+ <text name="payee_name">
+ Test Name That Is Extremely Long To Check Clipping
+ </text>
+ <text name="payment_message_label">
+ Descrição (opcional):
+ </text>
<panel label="Buscar" name="PatternsPanel">
<button label="Pagar L$ 1" label_selected="Pagar L$ 1" name="fastpay 1"/>
<button label="Pagar L$ 5" label_selected="Pagar L$ 5" name="fastpay 5"/>
@@ -11,7 +22,9 @@
<button label="Pagar L$ 20" label_selected="Pagar L$ 20" name="fastpay 20"/>
</panel>
<panel label="Buscar" name="InputPanel">
- <text name="amount text">Outro valor:</text>
+ <text name="amount text">
+ Outro valor:
+ </text>
<button label="Pagar" label_selected="Pagar" name="pay btn"/>
<button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/floater_script_queue.xml b/indra/newview/skins/default/xui/pt/floater_script_queue.xml
index 5fb6dd1c35..b9fc9d4713 100644
--- a/indra/newview/skins/default/xui/pt/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/pt/floater_script_queue.xml
@@ -15,5 +15,11 @@
<floater.string name="NotRunning">
Inerte
</floater.string>
+ <floater.string name="Timeout">
+ Limite de tempo: [OBJECT_NAME]
+ </floater.string>
+ <floater.string name="LoadingObjInv">
+ Carregando inventário de: [OBJECT_NAME]
+ </floater.string>
<button label="Fechar" label_selected="Fechar" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_web_content.xml b/indra/newview/skins/default/xui/pt/floater_web_content.xml
index 5101579c6f..2b22d3ec3c 100644
--- a/indra/newview/skins/default/xui/pt/floater_web_content.xml
+++ b/indra/newview/skins/default/xui/pt/floater_web_content.xml
@@ -10,5 +10,9 @@
<icon name="media_secure_lock_flag" tool_tip="Navegação segura"/>
<button name="popexternal" tool_tip="Abrir a URL atual no navegador do seu computador"/>
</layout_panel>
+ <layout_panel name="debug_controls">
+ <button name="web_test_home_page" tool_tip="Página inicial de testes de Web"/>
+ <button name="VLC Plugin Test" tool_tip="Teste de vídeo MPEG4"/>
+ </layout_panel>
</layout_stack>
</floater>
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 760197cfb9..d991c89f61 100644
--- a/indra/newview/skins/default/xui/pt/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/pt/menu_attachment_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="Ligar" name="Call"/>
<menu_item_call label="Convidar para entrar no grupo" name="Invite..."/>
<menu_item_call label="Redefinir esqueleto" name="Reset Skeleton"/>
+ <menu_item_call label="Redefinir esqueleto e animações" name="Reset Skeleton And Animations"/>
<menu_item_call label="Bloquear" name="Avatar Mute"/>
<menu_item_call label="Denunciar" name="abuse"/>
<menu_item_call label="Congelar" name="Freeze..."/>
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 766c8b9754..e2403fa86f 100644
--- a/indra/newview/skins/default/xui/pt/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml
@@ -10,6 +10,7 @@
<menu_item_call label="Editar meu corpo" name="Edit My Shape"/>
<menu_item_call label="Altura de foco" name="Hover Height"/>
<menu_item_call label="Redefinir esqueleto" name="Reset Skeleton"/>
+ <menu_item_call label="Redefinir esqueleto e animações" name="Reset Skeleton And Animations"/>
<menu_item_call label="Meus amigos" name="Friends..."/>
<menu_item_call label="Meus grupos" name="Groups..."/>
<menu_item_call label="Meu perfil" name="Profile..."/>
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 170525cbe6..cba849cd05 100644
--- a/indra/newview/skins/default/xui/pt/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/pt/menu_avatar_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="Ligar" name="Call"/>
<menu_item_call label="Convidar para entrar no grupo" name="Invite..."/>
<menu_item_call label="Redefinir esqueleto" name="Reset Skeleton"/>
+ <menu_item_call label="Redefinir esqueleto e animações" name="Reset Skeleton And Animations"/>
<menu_item_call label="Bloquear" name="Avatar Mute"/>
<menu_item_call label="Denunciar" name="abuse"/>
<menu_item_call label="Congelar" name="Freeze..."/>
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 e826a57b46..50a1996d62 100644
--- a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
@@ -27,6 +27,7 @@
<menu_item_call label="Editar meu corpo" name="Edit My Shape"/>
<menu_item_call label="Altura de foco" name="Hover Height"/>
<menu_item_call label="Redefinir esqueleto" name="Reset Skeleton"/>
+ <menu_item_call label="Redefinir esqueleto e animações" name="Reset Skeleton And Animations"/>
<menu_item_call label="Meus amigos" name="Friends..."/>
<menu_item_call label="Meus grupos" name="Groups..."/>
<menu_item_call label="Meu perfil" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/pt/menu_login.xml b/indra/newview/skins/default/xui/pt/menu_login.xml
index a65dfddb05..44cfae236b 100644
--- a/indra/newview/skins/default/xui/pt/menu_login.xml
+++ b/indra/newview/skins/default/xui/pt/menu_login.xml
@@ -20,12 +20,11 @@
<menu_item_check label="Exibir menu de depuração" name="Show Debug Menu"/>
<menu label="Depurar" name="Debug">
<menu_item_call label="Mostrar configurações" name="Debug Settings"/>
- <menu_item_call label="Configurações da interface e cor" name="UI/Color Settings"/>
<menu label="Testes de UI" name="UI Tests"/>
<menu_item_call label="Definir tamanho da janela:" name="Set Window Size..."/>
<menu_item_call label="Mostrar TOS" name="TOS"/>
<menu_item_call label="Mostrar mensagem crítica" name="Critical"/>
- <menu_item_call label="Test de Bugs de Conteúdo Web" name="Web Content Floater Debug Test"/>
+ <menu_item_call label="Navegador de Mídia" name="Media Browser"/>
<menu label="Configurar nível de registro em log" name="Set Logging Level">
<menu_item_check label="Depurar" name="Debug"/>
<menu_item_check label="Info" name="Info"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_object_icon.xml b/indra/newview/skins/default/xui/pt/menu_object_icon.xml
index df224a88fa..c6a1ca72f2 100644
--- a/indra/newview/skins/default/xui/pt/menu_object_icon.xml
+++ b/indra/newview/skins/default/xui/pt/menu_object_icon.xml
@@ -2,6 +2,7 @@
<menu name="Object Icon Menu">
<menu_item_call label="Perfil do objeto..." name="Object Profile"/>
<menu_item_call label="Bloquear..." name="Block"/>
+ <menu_item_call label="Desbloquear" name="Unblock"/>
<menu_item_call label="Mostrar no mapa" name="show_on_map"/>
<menu_item_call label="Teletransportar para lugar do objeto" name="teleport_to_object"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml
index 3602bdaac4..ccf65ae566 100644
--- a/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml
@@ -3,6 +3,10 @@
<menu_item_call label="Vestir - Substituir look atual" name="wear"/>
<menu_item_call label="Vestir - Adicionar ao look atual" name="wear_add"/>
<menu_item_call label="Tirar - Tirar do look atual" name="take_off"/>
+ <menu_item_call label="Carregar foto (L$ 10)" name="upload_photo"/>
+ <menu_item_call label="Selecionar foto" name="select_photo"/>
+ <menu_item_call label="Tirar uma foto" name="take_snapshot"/>
+ <menu_item_call label="Remover foto" name="remove_photo"/>
<menu label="Roupas novas" name="New Clothes">
<menu_item_call label="Nova camisa" name="New Shirt"/>
<menu_item_call label="Novas calças" name="New Pants"/>
@@ -27,4 +31,5 @@
<menu_item_call label="Recolher todas as pastas" name="collapse"/>
<menu_item_call label="Renomear look" name="rename"/>
<menu_item_call label="Excluir visual" name="delete_outfit"/>
+ <menu_item_check label="Sempre ordenar pastas por nome" name="sort_folders_by_name"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_friends_view.xml b/indra/newview/skins/default/xui/pt/menu_people_friends_view.xml
index 46caeae310..35315abfe6 100644
--- a/indra/newview/skins/default/xui/pt/menu_people_friends_view.xml
+++ b/indra/newview/skins/default/xui/pt/menu_people_friends_view.xml
@@ -4,5 +4,6 @@
<menu_item_check label="Ordenar por status" name="sort_status"/>
<menu_item_check label="Exibir ícones de pessoas" name="view_icons"/>
<menu_item_check label="Exibir permissões concedidas" name="view_permissions"/>
+ <menu_item_check label="Ocultar nomes de usuários" name="view_usernames"/>
<menu_item_check label="Exibir registro de conversas..." name="view_conversation"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby.xml
index 51464fed68..bd8afae1b5 100644
--- a/indra/newview/skins/default/xui/pt/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/pt/menu_people_nearby.xml
@@ -13,4 +13,6 @@
<menu_item_call label="Compartilhar" name="share"/>
<menu_item_call label="Pagar" name="pay"/>
<menu_item_check label="Bloquear/desbloquear" name="block_unblock"/>
+ <menu_item_call label="Congelar" name="freeze"/>
+ <menu_item_call label="Expulsar" name="eject"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby_view.xml
index bce015e732..2c49f5e2fd 100644
--- a/indra/newview/skins/default/xui/pt/menu_people_nearby_view.xml
+++ b/indra/newview/skins/default/xui/pt/menu_people_nearby_view.xml
@@ -5,4 +5,5 @@
<menu_item_check label="Ordenar por distância" name="sort_distance"/>
<menu_item_check label="Exibir ícones de pessoas" name="view_icons"/>
<menu_item_check label="Exibir mapa" name="view_map"/>
+ <menu_item_check label="Ocultar nomes de usuários" name="view_usernames"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_objectim.xml b/indra/newview/skins/default/xui/pt/menu_url_objectim.xml
index 2cd0f52ef3..0ebb358b12 100644
--- a/indra/newview/skins/default/xui/pt/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/pt/menu_url_objectim.xml
@@ -2,6 +2,7 @@
<context_menu name="Url Popup">
<menu_item_call label="Perfil do objeto..." name="show_object"/>
<menu_item_call label="Bloquear..." name="block_object"/>
+ <menu_item_call label="Desbloquear" name="unblock_object"/>
<menu_item_call label="Mostrar no mapa" name="show_on_map"/>
<menu_item_call label="Teletransportar para lugar do objeto" name="teleport_to_object"/>
<menu_item_call label="Copiar nome do objeto para área de transferência" name="url_copy_label"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index 7bdcb74a54..6964941f0a 100644
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -113,11 +113,11 @@
<menu_item_call label="Link" name="Link"/>
<menu_item_call label="Desconectar links" name="Unlink"/>
<menu_item_check label="Editar partes linkadas" name="Edit Linked Parts"/>
- <menu label="Selecionar partes conectadas" name="Select Linked Parts">
- <menu_item_call label="Selecionar próxima parte" name="Select Next Part"/>
- <menu_item_call label="Selecionar parte anterior" name="Select Previous Part"/>
- <menu_item_call label="Incluir próxima parte" name="Include Next Part"/>
- <menu_item_call label="Incluir parte anterior" name="Include Previous Part"/>
+ <menu label="Selecionar elementos" name="Select Elements">
+ <menu_item_call label="Selecionar próxima parte ou face" name="Select Next Part or Face"/>
+ <menu_item_call label="Selecionar parte anterior ou face" name="Select Previous Part or Face"/>
+ <menu_item_call label="Incluir próxima parte ou face" name="Include Next Part or Face"/>
+ <menu_item_call label="Incluir parte anterior ou face" name="Include Previous Part or Face"/>
</menu>
<menu_item_call label="Linksets..." name="pathfinding_linkset_menu_item"/>
<menu_item_call label="Enfocar seleção" name="Focus on Selection"/>
@@ -332,8 +332,7 @@
<menu_item_call label="Descartar cache do objeto de região" name="Dump Region Object Cache"/>
</menu>
<menu label="Interface" name="UI">
- <menu_item_call label="Teste de mídia do navegador" name="Web Browser Test"/>
- <menu_item_call label="Navegador de conteúdo web" name="Web Content Browser"/>
+ <menu_item_call label="Navegador de Mídia" name="Media Browser"/>
<menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/>
<menu_item_check label="Debug Clicks" name="Debug Clicks"/>
<menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_wearing_tab.xml b/indra/newview/skins/default/xui/pt/menu_wearing_tab.xml
index 4e6e52ebc7..42aa386215 100644
--- a/indra/newview/skins/default/xui/pt/menu_wearing_tab.xml
+++ b/indra/newview/skins/default/xui/pt/menu_wearing_tab.xml
@@ -3,4 +3,6 @@
<menu_item_call label="Tirar" name="take_off"/>
<menu_item_call label="Tirar" name="detach"/>
<menu_item_call label="Editar look" name="edit"/>
+ <menu_item_call label="Editar" name="edit_item"/>
+ <menu_item_call label="Mostrar original" name="show_original"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/mime_types.xml b/indra/newview/skins/default/xui/pt/mime_types.xml
index be387088bd..54902f165b 100644
--- a/indra/newview/skins/default/xui/pt/mime_types.xml
+++ b/indra/newview/skins/default/xui/pt/mime_types.xml
@@ -22,14 +22,6 @@
Iniciar filme
</playtip>
</widgetset>
- <widgetset name="none">
- <label name="none_label">
- Sem conteúdo
- </label>
- <tooltip name="none_tooltip">
- Sem mídia aqui
- </tooltip>
- </widgetset>
<widgetset name="image">
<label name="image_label">
Imagem
@@ -52,11 +44,24 @@
Iniciar áudio disponível neste local
</playtip>
</widgetset>
+ <widgetset name="none">
+ <label name="none_label">
+ Sem conteúdo
+ </label>
+ <tooltip name="none_tooltip">
+ Sem mídia aqui
+ </tooltip>
+ </widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
Transmissão em tempo real
</label>
</scheme>
+ <scheme name="libvlc">
+ <label name="libvlc_label">
+ Mídia com suporte a LibVLC
+ </label>
+ </scheme>
<mimetype name="blank">
<label name="blank_label">
- Nenhum -
@@ -127,11 +132,6 @@
Macromedia Director
</label>
</mimetype>
- <mimetype name="application/x-shockwave-flash">
- <label name="application/x-shockwave-flash_label">
- Flash
- </label>
- </mimetype>
<mimetype name="audio/mid">
<label name="audio/mid_label">
Áudio (MIDI)
@@ -207,6 +207,11 @@
Filme (MP4)
</label>
</mimetype>
+ <mimetype name="application/octet-stream">
+ <label name="video/octet-stream">
+ Filme
+ </label>
+ </mimetype>
<mimetype name="video/quicktime">
<label name="video/quicktime_label">
Filme (QuickTime)
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index bb428ad5a5..53a418a1d8 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -329,6 +329,9 @@ Se você não quiser que essas funções sejam concedidas a esse cargo, desative
Você está prestes a banir [COUNT] membros do grupo.
<usetemplate ignoretext="Confirmar banimento de diversos membros do grupo" name="okcancelignore" notext="Cancelar" yestext="Banir"/>
</notification>
+ <notification name="GroupBanUserOnBanlist">
+ Alguns residentes não receberam convite porque foram banidos do grupo.
+ </notification>
<notification name="AttachmentDrop">
Você está prestes a largar seu anexo.
Tem certeza de que quer prosseguir?
@@ -455,6 +458,12 @@ Para colocar a mídia em só uma face, selecione Selecionar face e clique na fac
<notification name="ErrorEncodingSnapshot">
Erro ao codificar a foto.
</notification>
+ <notification name="ErrorPhotoCannotAfford">
+ Você precisa de L$ [COST] para salvar uma foto em seu inventário. Você pode comprar L$ ou salvar a foto em seu computador.
+ </notification>
+ <notification name="ErrorTextureCannotAfford">
+ Você precisa de L$ [COST] para salvar uma textura em seu inventário. Você pode comprar L$ ou salvar a foto em seu computador.
+ </notification>
<notification name="ErrorUploadingPostcard">
Houve um problema ao enviar a foto devido à seguinte razão: [REASON]
</notification>
@@ -569,6 +578,10 @@ Nota: Este procedimento limpa o cache.
Excluir nota?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
+ <notification name="LoadPreviousReportScreenshot">
+ Você deseja usar a captura de tela anterior em seu relatório?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
Falha ao salvar Gesto.
Este gesto possui muitos passos.
@@ -629,30 +642,12 @@ Consultar [_URL] para mais informações?
</url>
<usetemplate ignoretext="O hardware do meu computador não é suportado" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
- <notification name="IntelOldDriver">
- Provavelmente, há um driver mais recente para o seu chip gráfico. A atualização dos drivers gráficos pode melhorar significativamente o desempenho.
-
- Visitar [_URL] para verificar se há atualizações do driver?
- <url name="url">
- http://www.intel.com/p/pt_BR/support/detect/graphics
- </url>
- <usetemplate ignoretext="Meu driver gráfico está desatualizado" name="okcancelignore" notext="Não" yestext="Sim"/>
- </notification>
- <notification name="AMDOldDriver">
+ <notification name="OldGPUDriver">
Provavelmente, há um driver mais recente para o seu chip gráfico. A atualização dos drivers gráficos pode melhorar significativamente o desempenho.
- Visitar [_URL] para verificar se há atualizações do driver?
+ Visitar [URL] para verificar se há atualizações do driver?
<url name="url">
- http://support.amd.com/us/Pages/AMDSupportHub.aspx
- </url>
- <usetemplate ignoretext="Meu driver gráfico está desatualizado" name="okcancelignore" notext="Não" yestext="Sim"/>
- </notification>
- <notification name="NVIDIAOldDriver">
- Provavelmente, há um driver mais recente para o seu chip gráfico. A atualização dos drivers gráficos pode melhorar significativamente o desempenho.
-
- Visitar [_URL] para verificar se há atualizações do driver?
- <url name="url">
- http://www.nvidia.com.br/Download/index.aspx?lang=br
+ [URL]
</url>
<usetemplate ignoretext="Meu driver gráfico está desatualizado" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
@@ -743,6 +738,9 @@ Para mais informações sobre como comprar L$, consulte [_URL].
</url>
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir até a página"/>
</notification>
+ <notification name="MuteLimitReached">
+ Não foi possível adicionar uma nova entrada à lista de bloqueados porque você atingiu o limite de [MUTE_LIMIT] entradas.
+ </notification>
<notification name="UnableToLinkObjects">
Não é possível unir estes [COUNT] objetos.
Você pode unir um máximo de [MAX] objetos.
@@ -1372,6 +1370,11 @@ Enquando isso, use o [SECOND_LIFE] normalmente. Seu visual será exibido correta
</notification>
<notification name="AgentComplexity">
Sua [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 avatar complexity] é [AGENT_COMPLEXITY].
+ <usetemplate ignoretext="Avise-me se a complexidade do meu avatar for alterada" name="notifyignore"/>
+ </notification>
+ <notification name="HUDComplexityWarning">
+ [HUD_REASON], provavelmente afetará negativamente seu desempenho.
+ <usetemplate ignoretext="Avise-me quando a complexidade do meu HUD estiver muito alta" name="notifyignore"/>
</notification>
<notification name="FirstRun">
A instalação do [APP_NAME] está pronta.
@@ -1462,6 +1465,10 @@ Isso é realmente útil apenas para depuração.
Teletransportar para o início todos os residentes nesta região?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
+ <notification name="ChangeObjectBonusFactor">
+ Reduzir o bônus do objeto depois que as construções tiverem sido estabelecidas em uma região pode fazer com que os objetos sejam devolvidos ou excluídos. Tem certeza de que deseja alterar o bônus do objeto?
+ <usetemplate ignoretext="Confirmar alteração do fator de bônus de objeto" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="EstateObjectReturn">
Você tem certeza que deseja retornar os objetos pertencentes a [USER_NAME] ?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
@@ -1509,6 +1516,9 @@ Ultrapassa o limite de [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS].
<notification name="OwnerCanNotBeDenied">
Não é possível adicionar o dono da propriedade na lista de residentes banidos.
</notification>
+ <notification name="ProblemAddingEstateManagerBanned">
+ Não foi possível adicionar residentes banidos à lista de gerentes de propriedades.
+ </notification>
<notification name="CanNotChangeAppearanceUntilLoaded">
Não é possível alterar a aparência até que as roupas e formas estejam carregadas.
</notification>
@@ -1683,6 +1693,10 @@ Se você estiver muito ansioso para experimentar os novos recursos e correções
Abrir uma janela do navegador para ver essas informações?
<usetemplate ignoretext="Abrir o navegador para acessar uma página na web" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
+ <notification name="SystemUIScaleFactorChanged">
+ O fator de tamanho da interface do sistema foi alterado desde a última execução. Deseja abrir a página de configurações de ajuste de tamanho da interface?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="WebLaunchJoinNow">
Deseja abrir o [http://secondlife.com/account/ Painel] para gerenciar sua conta?
<usetemplate ignoretext="Abrir o navegador para acessar minha conta" name="okcancelignore" notext="Cancelar" yestext="OK"/>
@@ -1721,10 +1735,17 @@ Se você estiver muito ansioso para experimentar os novos recursos e correções
Você é atualmente um membro do grupo
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sair"/>
</notification>
+ <notification name="GroupDepart">
+ Você deixou o grupo &apos;[group_name]&apos;.
+ </notification>
<notification name="OwnerCannotLeaveGroup">
Não foi possível deixar o grupo. Você não pode deixar o grupo pois é o último proprietário dele. Primeiramente, atribua outro membro à função de proprietário.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="GroupDepartError">
+ Não foi possível deixar o grupo.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="ConfirmKick">
Tem CERTEZA de que deseja expulsar todos os residentes do grid?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Chutar todos"/>
@@ -2123,6 +2144,10 @@ Isto mudará milhares de regiões e fará o spaceserver soluçar.
Muitos prims foram selecionados. Selecione [MAX_PRIM_COUNT] ou menos prims, e tente de novo
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="TooManyScriptsSelected">
+ Muitos scripts nos objetos selecionados. Selecione menos objetos e tente novamente.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="ProblemImportingEstateCovenant">
Problemas encontrados ao importar o Corretor da propriedade.
<usetemplate name="okbutton" yestext="OK"/>
@@ -2291,6 +2316,10 @@ Mover para o inventário o(s) item(s)?
Falha no pagamento: objeto não encontrado.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="PaymentBlockedButtonMismatch">
+ Pagamento interrompido: o valor pago não corresponde aos botões de pagamento definidos para esse objeto.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
Não há itens neste objeto que você está autorizado a copiar.
</notification>
@@ -2326,6 +2355,12 @@ Não é possível desfazer essa ação.
Essa é uma seleção ampla com linksets. Se você desvinculá-la, pode não ser possível vinculá-la novamente. Como precaução, pode ser interessante fazer cópias dos linksets no seu inventário.
<usetemplate ignoretext="Confirmar quando desvincular um linkset" name="okcancelignore" notext="Cancelar" yestext="Desvincular"/>
</notification>
+ <notification name="HelpReportAbuseConfirm">
+ Obrigado por nos informar sobre esse problema.
+Nós analisaremos seu relatório em busca de possíveis violações e
+tomaremos as medidas cabíveis.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="HelpReportAbuseSelectCategory">
Por favor, selecione uma categoria para a reportagem deste abuso.
A seleção de uma categoria nos ajuda a arquivar e processar as reportagens de abuso.
@@ -2751,6 +2786,10 @@ Logo, não é possível voar aqui.
<notification name="PathfindingDirty">
A região possui alterações de pathfinding pendentes. Se você possui direitos de construção, poderá recarregar a região clicando no botão “Recarregar região”.
</notification>
+ <notification name="PathfindingDirtyRebake">
+ A região possui alterações de pathfinding pendentes. Se você possui direitos de construção, poderá recarregar a região clicando no botão “Recarregar região”.
+ <usetemplate name="okbutton" yestext="Recarregar região"/>
+ </notification>
<notification name="DynamicPathfindingDisabled">
O pathfinding dinâmico não está habilitado nesta região. Os objetos com script usando chamadas LSL de pathfinding podem não operar como o esperado na região.
</notification>
@@ -3258,10 +3297,12 @@ Para sua segurança, os SLurls serão bloqueados por alguns instantes.
</notification>
<notification name="AppearanceToXMLFailed">
Falha ao salvar a aparência como XML.
- icon=&quot;notifytip.tga&quot;
- name=&quot;PresetNotDeleted&quot;
- type=&quot;notifytip&quot;&gt;
-Erro ao excluir a predefinição [NAME].
+ </notification>
+ <notification name="PresetNotSaved">
+ Erro ao salvar predefinição [NAME].
+ </notification>
+ <notification name="PresetNotDeleted">
+ Erro ao excluir a predefinição [NAME].
</notification>
<notification name="UnableToFindHelpTopic">
Nenhum tópico de ajuda foi encontrado com relação a este elemento.
@@ -3469,13 +3510,6 @@ Se o botão Falar for ocultado, o recurso de voz será desabilitado.
<notification name="ForceQuitDueToLowMemory">
O SL será encerrado em 30 segundos devido falta de memória.
</notification>
- <notification name="PopupAttempt">
- Um pop-up foi bloqueado.
- <form name="form">
- <ignore name="ignore" text="Ativar todos os pop-ups"/>
- <button name="open" text="Abrir pop-up"/>
- </form>
- </notification>
<notification name="SOCKS_NOT_PERMITTED">
O proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; recusou a conexão, não permitida pelo conjunto de regras.
<usetemplate name="okbutton" yestext="OK"/>
@@ -3850,6 +3884,9 @@ Tente novamente em instantes.
Não é possível mover &apos;[OBJECT_NAME]&apos; para
[OBJ_POSITION] na região [REGION_NAME] porque não há recursos suficientes para este objeto neste lote.
</notification>
+ <notification name="NoParcelPermsNoObject">
+ A cópia falhou porque você não tem acesso a esse lote.
+ </notification>
<notification name="CantMoveObjectRegionVersion">
Não é possível mover &apos;[OBJECT_NAME]&apos; para
[OBJ_POSITION] na região [REGION_NAME] porque outra região está executando uma versão mais antiga, que não dá suporte o recebimento deste objeto por meio de passagem de regiões.
@@ -3865,6 +3902,10 @@ Tente novamente em instantes.
<notification name="NoPermModifyObject">
Você não está autorizado a modificar este objeto
</notification>
+ <notification name="TooMuchObjectInventorySelected">
+ Há muitos objetos com inventário grande selecionados. Selecione menos objetos e tente novamente.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CantEnablePhysObjContributesToNav">
Não é possível ativar propriedades físicas para um objeto que contribui para o navmesh.
</notification>
@@ -3901,6 +3942,12 @@ Tente novamente em instantes.
<notification name="CantSaveModifyAttachment">
Não é possível salvar no conteúdo do objeto: isso modificaria as permissões de anexo.
</notification>
+ <notification name="AttachmentHasTooMuchInventory">
+ Seus anexos têm muitos itens de inventário. Não é possível adicionar mais itens.
+ </notification>
+ <notification name="IllegalAttachment">
+ O anexo solicitou um ponto não existente no avatar. Ele foi anexado ao peito.
+ </notification>
<notification name="TooManyScripts">
Muitos scripts.
</notification>
@@ -3993,6 +4040,12 @@ Tente novamente em instantes.
<notification name="TeleportedByObjectUnknownUser">
Você foi teletransportado pelo objeto &apos;[OBJECT_NAME]&apos; de propriedade de um usuário desconhecido.
</notification>
+ <notification name="StandDeniedByObject">
+ &apos;[OBJECT_NAME]&apos; não permite que você fique de pé no momento.
+ </notification>
+ <notification name="ResitDeniedByObject">
+ &apos;[OBJECT_NAME]&apos; não permite que você altere seu assento no momento.
+ </notification>
<notification name="CantCreateObjectRegionFull">
Não foi possível criar o objeto solicitado. A região está cheia.
</notification>
@@ -4074,9 +4127,6 @@ Tente novamente em instantes.
<notification name="CantAttachNotEnoughScriptResources">
Não há recursos de script disponíveis suficientes para anexar objeto!
</notification>
- <notification name="IllegalAttachment">
- O anexo solicitou um ponto não existente no avatar. Ele foi anexado ao peito.
- </notification>
<notification name="CantDropItemTrialUser">
Não é possível largar objetos aqui. Tente a área de Avaliação grátis.
</notification>
@@ -4292,6 +4342,9 @@ Tente selecionar uma quantidade menor de terreno.
<notification name="CantTransfterMoneyRegionDisabled">
Transferências de dinheiro para objetos estão desativadas para esta região no momento.
</notification>
+ <notification name="DroppedMoneyTransferRequest">
+ Não foi possível fazer o pagamento devido a uma sobrecarga do sistema.
+ </notification>
<notification name="CantPayNoAgent">
Não foi possível descobrir a quem pagar.
</notification>
@@ -4327,4 +4380,8 @@ Tente selecionar uma quantidade menor de terreno.
O arquivo de histórico de bate-papo está ocupado com uma operação anterior. Tente novamente em alguns minutos ou selecione outra pessoa para bater papo.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="OutfitPhotoLoadError">
+ [REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
</notifications>
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 816a9bc46e..8d055f476e 100644
--- a/indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml
@@ -7,6 +7,7 @@
Vestir itens selecionados
</panel.string>
<tab_container name="appearance_tabs">
+ <panel label="GALERIA DE LOOKS" name="outfit_gallery_tab"/>
<panel label="MEUS LOOKS" name="outfitslist_tab"/>
<panel label="EM USO" name="cof_tab"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/pt/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/pt/panel_outfits_wearing.xml
index 9224ec4742..87bb04ff59 100644
--- a/indra/newview/skins/default/xui/pt/panel_outfits_wearing.xml
+++ b/indra/newview/skins/default/xui/pt/panel_outfits_wearing.xml
@@ -1,6 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Wearing">
+ <panel.string name="no_attachments">
+ Nenhum anexo vestido.
+ </panel.string>
+ <accordion name="wearables_accordion">
+ <accordion_tab name="tab_wearables" title="Itens de vestuário"/>
+ <accordion_tab name="tab_temp_attachments" title="Anexos temporários"/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/>
+ <menu_button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/>
</panel>
</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 6308d133bb..c6f6bba320 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
@@ -30,6 +30,7 @@
<combo_box.item label="Baixarei e instalarei as atualizações manualmente" name="Install_manual"/>
</combo_box>
<check_box label="Disposto a atualizar para candidatos da versão" name="update_willing_to_test"/>
+ <check_box label="Mostrar notas de versão após atualização" name="update_show_release_notes"/>
<text name="Proxy Settings:">
Configurações de proxy:
</text>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index b3cb50a01e..207b4e7097 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -52,17 +52,34 @@ Placa gráfica: [GRAPHICS_CARD]
<string name="AboutDriver">
Versão do driver de vídeo Windows: [GRAPHICS_CARD_VENDOR]
</string>
- <string name="AboutLibs">
+ <string name="AboutOGL">
Versão do OpenGL: [OPENGL_VERSION]
-
-Versão do J2C Decoder: [J2C_VERSION]
+ </string>
+ <string name="AboutSettings">
+ Tamanho da janela: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
+Ajuste do tamanho de fonte: [FONT_SIZE_ADJUSTMENT]pt
+Escala de interface: [UI_SCALE]
+Dist. máxima: [DRAW_DISTANCE]m
+Largura de banda: [NET_BANDWITH]kbit/s
+Fator LOD: [LOD_FACTOR]
+Qualidade de renderização: [RENDER_QUALITY] / 7
+Modelo de iluminação avançado: [GPU_SHADERS]
+Memória de textura: [TEXTURE_MEMORY]MB
+Tempo de criação de VFS (cache): [VFS_TIME]
+ </string>
+ <string name="AboutLibs">
+ Versão do J2C Decoder: [J2C_VERSION]
Versão do driver de áudio: [AUDIO_DRIVER_VERSION]
Versão de LLCEFLib/CEF: [LLCEFLIB_VERSION]
+Versão da LibVLC: [LIBVLC_VERSION]
Versão do servidor de voz: [VOICE_VERSION]
</string>
<string name="AboutTraffic">
Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</string>
+ <string name="AboutTime">
+ [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]
+ </string>
<string name="ErrorFetchingServerReleaseNotesURL">
Erro ao obter URL de notas de versão do servidor.
</string>
@@ -1038,6 +1055,9 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="TeleportYourAgent">
Teletransportá-lo
</string>
+ <string name="ForceSitAvatar">
+ Forçar o avatar a sentar
+ </string>
<string name="AgentNameSubst">
(Você)
</string>
@@ -1877,6 +1897,27 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="av_render_anyone">
Sua renderização pode não acontecer para ninguém ao seu redor.
</string>
+ <string name="hud_description_total">
+ Seu HUD
+ </string>
+ <string name="hud_name_with_joint">
+ [OBJ_NAME] (vestido em [JNT_NAME])
+ </string>
+ <string name="hud_render_memory_warning">
+ [HUD_DETAILS] usa muita memória de textura
+ </string>
+ <string name="hud_render_cost_warning">
+ [HUD_DETAILS] contém muitos objetos e texturas que utilizam o máximo de recursos
+ </string>
+ <string name="hud_render_heavy_textures_warning">
+ [HUD_DETAILS] contém muitas texturas grandes
+ </string>
+ <string name="hud_render_cramped_warning">
+ [HUD_DETAILS] contém muitos objetos
+ </string>
+ <string name="hud_render_textures_warning">
+ [HUD_DETAILS] contém muitas texturas
+ </string>
<string name="AgeYearsA">
[COUNT] ano
</string>
@@ -2036,6 +2077,9 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="ObjectOutOfRange">
Script (objeto fora de alcance)
</string>
+ <string name="ScriptWasDeleted">
+ Script (excluído do inventário)
+ </string>
<string name="GodToolsObjectOwnedBy">
Objeto [OBJECT] de propriedade de [OWNER]
</string>
@@ -2606,6 +2650,15 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="Play Media">
Tocar/Pausar mídia
</string>
+ <string name="IntelDriverPage">
+ http://www.intel.com/p/en_US/support/detect/graphics
+ </string>
+ <string name="NvidiaDriverPage">
+ http://www.nvidia.com.br/Download/index.aspx?lang=br
+ </string>
+ <string name="AMDDriverPage">
+ http://support.amd.com/us/Pages/AMDSupportHub.aspx
+ </string>
<string name="MBCmdLineError">
Um erro foi encontrado analisando a linha de comando.
Consulte: http://wiki.secondlife.com/wiki/Client_parameters
@@ -4353,12 +4406,18 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="paid_you_ldollars">
[NAME] lhe pagou L$ [AMOUNT] [REASON].
</string>
+ <string name="paid_you_ldollars_gift">
+ [NAME] lhe pagou L$ [AMOUNT]: [REASON]
+ </string>
<string name="paid_you_ldollars_no_reason">
[NAME] lhe pagou L$ [AMOUNT]
</string>
<string name="you_paid_ldollars">
Você pagou L$[AMOUNT] por [REASON] a [NAME].
</string>
+ <string name="you_paid_ldollars_gift">
+ Você pagou L$[AMOUNT] a [NAME]: [REASON]
+ </string>
<string name="you_paid_ldollars_no_info">
Você acaba de pagar L$[AMOUNT].
</string>
@@ -4371,6 +4430,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="you_paid_failure_ldollars">
Você não pagou L$[AMOUNT] a [NAME] referentes a [REASON].
</string>
+ <string name="you_paid_failure_ldollars_gift">
+ Você não pagou L$[AMOUNT] a [NAME]: [REASON]
+ </string>
<string name="you_paid_failure_ldollars_no_info">
Você não pagou L$[AMOUNT].
</string>
@@ -4697,6 +4759,15 @@ Denunciar abuso
<string name="texture_load_dimensions_error">
A imagem excede o limite [WIDTH]*[HEIGHT]
</string>
+ <string name="outfit_photo_load_dimensions_error">
+ O tamanho máx. do look é [WIDTH]*[HEIGHT]. Redimensione ou use outra imagem
+ </string>
+ <string name="outfit_photo_select_dimensions_error">
+ O tamanho máx. do look é [WIDTH]*[HEIGHT]. Selecione outra textura
+ </string>
+ <string name="outfit_photo_verify_dimensions_error">
+ Não foi possível confirmar as dimensões da foto. Aguarde até que o tamanho da foto seja exibido no seletor
+ </string>
<string name="words_separator" value=","/>
<string name="server_is_down">
Aconteceu algo inesperado, apesar de termos tentado impedir isso.
@@ -5201,6 +5272,9 @@ Tente colocar o caminho do editor entre aspas.
<string name="Command_Profile_Label">
Perfil
</string>
+ <string name="Command_Report_Abuse_Label">
+ Relatar abuso
+ </string>
<string name="Command_Search_Label">
Buscar
</string>
@@ -5291,6 +5365,9 @@ Tente colocar o caminho do editor entre aspas.
<string name="Command_Profile_Tooltip">
Edite ou visualize seu perfil
</string>
+ <string name="Command_Report_Abuse_Tooltip">
+ Relatar abuso
+ </string>
<string name="Command_Search_Tooltip">
Encontre lugares, eventos, pessoas
</string>
diff --git a/indra/newview/skins/default/xui/ru/floater_model_preview.xml b/indra/newview/skins/default/xui/ru/floater_model_preview.xml
index d660dd97b5..94aa721856 100644
--- a/indra/newview/skins/default/xui/ru/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/ru/floater_model_preview.xml
@@ -245,6 +245,7 @@
</text>
<check_box label="Включить вес кожи" name="upload_skin"/>
<check_box label="Включить положения суставов" name="upload_joints"/>
+ <check_box label="Фиксировать масштаб, если определено положение сустава" name="lock_scale_if_joint_position"/>
<text name="pelvis_offset_label">
Смещение по Z (поднять или опустить аватар):
</text>
diff --git a/indra/newview/skins/default/xui/ru/floater_pay.xml b/indra/newview/skins/default/xui/ru/floater_pay.xml
index 0a269b9e00..990ebb873f 100644
--- a/indra/newview/skins/default/xui/ru/floater_pay.xml
+++ b/indra/newview/skins/default/xui/ru/floater_pay.xml
@@ -1,9 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money">
- <string name="payee_group">Заплатить группе</string>
- <string name="payee_resident">Заплатить жителю</string>
- <text name="paying_text">Вы платите:</text>
- <text name="payee_name">Слишком длинное тестовое имя для проверки обрезания</text>
+ <string name="payee_group">
+ Заплатить группе
+ </string>
+ <string name="payee_resident">
+ Заплатить жителю
+ </string>
+ <text name="paying_text">
+ Вы платите:
+ </text>
+ <text name="payee_name">
+ Слишком длинное тестовое имя для проверки обрезания
+ </text>
+ <text name="payment_message_label">
+ Описание (не обязательно):
+ </text>
<panel label="Поиск" name="PatternsPanel">
<button label="Оплатить L$ 1" label_selected="Оплатить L$ 1" name="fastpay 1"/>
<button label="Оплатить L$ 5" label_selected="Оплатить L$ 5" name="fastpay 5"/>
@@ -11,7 +22,9 @@
<button label="Оплатить L$ 20" label_selected="Оплатить L$ 20" name="fastpay 20"/>
</panel>
<panel label="Поиск" name="InputPanel">
- <text name="amount text">Другая сумма:</text>
+ <text name="amount text">
+ Другая сумма:
+ </text>
<button label="Оплатить" label_selected="Оплатить" name="pay btn"/>
<button label="Отмена" label_selected="Отмена" name="cancel btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ru/floater_script_queue.xml b/indra/newview/skins/default/xui/ru/floater_script_queue.xml
index 4f2e389b19..90c1f2f49c 100644
--- a/indra/newview/skins/default/xui/ru/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/ru/floater_script_queue.xml
@@ -15,5 +15,11 @@
<floater.string name="NotRunning">
Не запущен
</floater.string>
+ <floater.string name="Timeout">
+ Задержка: [OBJECT_NAME]
+ </floater.string>
+ <floater.string name="LoadingObjInv">
+ Загрузка инвентаря для: [OBJECT_NAME]
+ </floater.string>
<button label="Закрыть" label_selected="Закрыть" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_web_content.xml b/indra/newview/skins/default/xui/ru/floater_web_content.xml
index 403ab0ef5d..d572a54b5b 100644
--- a/indra/newview/skins/default/xui/ru/floater_web_content.xml
+++ b/indra/newview/skins/default/xui/ru/floater_web_content.xml
@@ -10,5 +10,9 @@
<icon name="media_secure_lock_flag" tool_tip="Безопасный просмотр"/>
<button name="popexternal" tool_tip="Открыть текущий URL-адрес в вашем браузере"/>
</layout_panel>
+ <layout_panel name="debug_controls">
+ <button name="web_test_home_page" tool_tip="Главная страница веб-тестирования"/>
+ <button name="VLC Plugin Test" tool_tip="Тест видео MPEG4"/>
+ </layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/ru/menu_attachment_other.xml b/indra/newview/skins/default/xui/ru/menu_attachment_other.xml
index b7ffb0e9fc..63b0698c6b 100644
--- a/indra/newview/skins/default/xui/ru/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/ru/menu_attachment_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="Звонок" name="Call"/>
<menu_item_call label="Пригласить в группу" name="Invite..."/>
<menu_item_call label="Сброс скелета" name="Reset Skeleton"/>
+ <menu_item_call label="Восстановить скелет и анимации" name="Reset Skeleton And Animations"/>
<menu_item_call label="Заблокировать" name="Avatar Mute"/>
<menu_item_call label="Пожаловаться" name="abuse"/>
<menu_item_call label="Заморозить" name="Freeze..."/>
diff --git a/indra/newview/skins/default/xui/ru/menu_attachment_self.xml b/indra/newview/skins/default/xui/ru/menu_attachment_self.xml
index eb38371e28..f33ef1d4ee 100644
--- a/indra/newview/skins/default/xui/ru/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/ru/menu_attachment_self.xml
@@ -10,6 +10,7 @@
<menu_item_call label="Изменить фигуру" name="Edit My Shape"/>
<menu_item_call label="Высота парения" name="Hover Height"/>
<menu_item_call label="Сброс скелета" name="Reset Skeleton"/>
+ <menu_item_call label="Восстановить скелет и анимации" name="Reset Skeleton And Animations"/>
<menu_item_call label="Мои друзья" name="Friends..."/>
<menu_item_call label="Мои группы" name="Groups..."/>
<menu_item_call label="Мой профиль" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/ru/menu_avatar_other.xml b/indra/newview/skins/default/xui/ru/menu_avatar_other.xml
index cffb4bbe7b..de35264055 100644
--- a/indra/newview/skins/default/xui/ru/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/ru/menu_avatar_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="Звонок" name="Call"/>
<menu_item_call label="Пригласить в группу" name="Invite..."/>
<menu_item_call label="Сброс скелета" name="Reset Skeleton"/>
+ <menu_item_call label="Восстановить скелет и анимации" name="Reset Skeleton And Animations"/>
<menu_item_call label="Заблокировать" name="Avatar Mute"/>
<menu_item_call label="Пожаловаться" name="abuse"/>
<menu_item_call label="Заморозить" name="Freeze..."/>
diff --git a/indra/newview/skins/default/xui/ru/menu_avatar_self.xml b/indra/newview/skins/default/xui/ru/menu_avatar_self.xml
index 97e2a8b295..cd75551b5d 100644
--- a/indra/newview/skins/default/xui/ru/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/ru/menu_avatar_self.xml
@@ -27,6 +27,7 @@
<menu_item_call label="Изменить фигуру" name="Edit My Shape"/>
<menu_item_call label="Высота парения" name="Hover Height"/>
<menu_item_call label="Сброс скелета" name="Reset Skeleton"/>
+ <menu_item_call label="Восстановить скелет и анимации" name="Reset Skeleton And Animations"/>
<menu_item_call label="Мои друзья" name="Friends..."/>
<menu_item_call label="Мои группы" name="Groups..."/>
<menu_item_call label="Мой профиль" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/ru/menu_login.xml b/indra/newview/skins/default/xui/ru/menu_login.xml
index 2deab04d81..2d1fe28242 100644
--- a/indra/newview/skins/default/xui/ru/menu_login.xml
+++ b/indra/newview/skins/default/xui/ru/menu_login.xml
@@ -20,13 +20,12 @@
<menu_item_check label="Показать меню отладки" name="Show Debug Menu"/>
<menu label="Отладка" name="Debug">
<menu_item_call label="Настройки отладки" name="Debug Settings"/>
- <menu_item_call label="Настройки интерфейса/цвета" name="UI/Color Settings"/>
<menu_item_call label="Просмотр XUI" name="UI Preview Tool"/>
<menu label="Тест UI" name="UI Tests"/>
<menu_item_call label="Задать размер окна..." name="Set Window Size..."/>
<menu_item_call label="Показать лицензионное соглашение" name="TOS"/>
<menu_item_call label="Показать сообщение об ошибке" name="Critical"/>
- <menu_item_call label="Тест отладки плавающего окна с веб-контентом" name="Web Content Floater Debug Test"/>
+ <menu_item_call label="Медиа-браузер" name="Media Browser"/>
<menu label="Уровень журнала" name="Set Logging Level">
<menu_item_check label="Отладка" name="Debug"/>
<menu_item_check label="Информация" name="Info"/>
diff --git a/indra/newview/skins/default/xui/ru/menu_object_icon.xml b/indra/newview/skins/default/xui/ru/menu_object_icon.xml
index 0c50abcfbd..bb97fb2ef7 100644
--- a/indra/newview/skins/default/xui/ru/menu_object_icon.xml
+++ b/indra/newview/skins/default/xui/ru/menu_object_icon.xml
@@ -2,6 +2,7 @@
<menu name="Object Icon Menu">
<menu_item_call label="Профиль объекта..." name="Object Profile"/>
<menu_item_call label="Блокировать..." name="Block"/>
+ <menu_item_call label="Разблокировать" name="Unblock"/>
<menu_item_call label="Показать на карте" name="show_on_map"/>
<menu_item_call label="Телепорт в местоположение объекта" name="teleport_to_object"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml b/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml
index d379a17216..24d780ba1c 100644
--- a/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml
@@ -3,6 +3,10 @@
<menu_item_call label="Надеть – Заменить текущий костюм" name="wear"/>
<menu_item_call label="Надеть – Добавить к текущему костюму" name="wear_add"/>
<menu_item_call label="Снять – Убрать из текущего костюма" name="take_off"/>
+ <menu_item_call label="Загрузить фото (L$10)" name="upload_photo"/>
+ <menu_item_call label="Выбрать фото" name="select_photo"/>
+ <menu_item_call label="Сделать снимок" name="take_snapshot"/>
+ <menu_item_call label="Удалить фото" name="remove_photo"/>
<menu label="Новая одежда" name="New Clothes">
<menu_item_call label="Новая рубашка" name="New Shirt"/>
<menu_item_call label="Новые брюки" name="New Pants"/>
@@ -27,4 +31,5 @@
<menu_item_call label="Закрыть все папки" name="collapse"/>
<menu_item_call label="Переименовать костюм" name="rename"/>
<menu_item_call label="Удалить костюм" name="delete_outfit"/>
+ <menu_item_check label="Всегда сортировать папки по имени" name="sort_folders_by_name"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_friends_view.xml b/indra/newview/skins/default/xui/ru/menu_people_friends_view.xml
index 7b2dba0539..fd04810dff 100644
--- a/indra/newview/skins/default/xui/ru/menu_people_friends_view.xml
+++ b/indra/newview/skins/default/xui/ru/menu_people_friends_view.xml
@@ -4,5 +4,6 @@
<menu_item_check label="Сортировать по статусу" name="sort_status"/>
<menu_item_check label="Показывать значки людей" name="view_icons"/>
<menu_item_check label="Показывать разрешенные действия" name="view_permissions"/>
+ <menu_item_check label="Скрывать имена пользователей" name="view_usernames"/>
<menu_item_check label="Посмотреть журнал разговора..." name="view_conversation"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_nearby.xml b/indra/newview/skins/default/xui/ru/menu_people_nearby.xml
index d05b7e7d01..952e9b1687 100644
--- a/indra/newview/skins/default/xui/ru/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/ru/menu_people_nearby.xml
@@ -13,4 +13,6 @@
<menu_item_call label="Поделиться" name="share"/>
<menu_item_call label="Заплатить" name="pay"/>
<menu_item_check label="Черный список" name="block_unblock"/>
+ <menu_item_call label="Заморозить" name="freeze"/>
+ <menu_item_call label="Выкинуть" name="eject"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/ru/menu_people_nearby_view.xml
index 2bc353ad58..0e949cedff 100644
--- a/indra/newview/skins/default/xui/ru/menu_people_nearby_view.xml
+++ b/indra/newview/skins/default/xui/ru/menu_people_nearby_view.xml
@@ -5,4 +5,5 @@
<menu_item_check label="Сортировать по расстоянию" name="sort_distance"/>
<menu_item_check label="Показывать значки людей" name="view_icons"/>
<menu_item_check label="Смотреть карту" name="view_map"/>
+ <menu_item_check label="Скрывать имена пользователей" name="view_usernames"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_objectim.xml b/indra/newview/skins/default/xui/ru/menu_url_objectim.xml
index 4f5361b2e3..1b77770e1c 100644
--- a/indra/newview/skins/default/xui/ru/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/ru/menu_url_objectim.xml
@@ -2,6 +2,7 @@
<context_menu name="Url Popup">
<menu_item_call label="Профиль объекта..." name="show_object"/>
<menu_item_call label="Блокировать..." name="block_object"/>
+ <menu_item_call label="Разблокировать" name="unblock_object"/>
<menu_item_call label="Показать на карте" name="show_on_map"/>
<menu_item_call label="Телепорт в местоположение объекта" name="teleport_to_object"/>
<menu_item_call label="Копировать название объекта в буфер обмена" name="url_copy_label"/>
diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml
index 6158363e5d..e5e484173d 100644
--- a/indra/newview/skins/default/xui/ru/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml
@@ -111,11 +111,11 @@
<menu_item_call label="Объединить" name="Link"/>
<menu_item_call label="Разъединить" name="Unlink"/>
<menu_item_check label="Редактировать объединенные части" name="Edit Linked Parts"/>
- <menu label="Выбрать объединенные части" name="Select Linked Parts">
- <menu_item_call label="Выбрать следующую" name="Select Next Part"/>
- <menu_item_call label="Выбрать предыдущую" name="Select Previous Part"/>
- <menu_item_call label="Включить следующую" name="Include Next Part"/>
- <menu_item_call label="Включить предыдущую" name="Include Previous Part"/>
+ <menu label="Выберите элементы" name="Select Elements">
+ <menu_item_call label="Выбрать следующую часть или лицо" name="Select Next Part or Face"/>
+ <menu_item_call label="Выбрать предыдущую часть или лицо" name="Select Previous Part or Face"/>
+ <menu_item_call label="Включить следующую часть или лицо" name="Include Next Part or Face"/>
+ <menu_item_call label="Включить предыдущую часть или лицо" name="Include Previous Part or Face"/>
</menu>
<menu_item_call label="Наборы связей..." name="pathfinding_linkset_menu_item"/>
<menu_item_call label="Фокус на выбранном" name="Focus on Selection"/>
@@ -365,8 +365,7 @@
<menu_item_call label="Вывод кэша региональных объектов" name="Dump Region Object Cache"/>
</menu>
<menu label="Интерфейс пользователя" name="UI">
- <menu_item_call label="Проверка медиабраузера" name="Web Browser Test"/>
- <menu_item_call label="Браузер для просмотра веб-контента" name="Web Content Browser"/>
+ <menu_item_call label="Браузер для просмотра медиа" name="Media Browser"/>
<menu_item_call label="Вывод SelectMgr" name="Dump SelectMgr"/>
<menu_item_call label="Вывод инвентаря" name="Dump Inventory"/>
<menu_item_call label="Вывод таймеров" name="Dump Timers"/>
diff --git a/indra/newview/skins/default/xui/ru/menu_wearing_tab.xml b/indra/newview/skins/default/xui/ru/menu_wearing_tab.xml
index f178b39c77..1e32090c2a 100644
--- a/indra/newview/skins/default/xui/ru/menu_wearing_tab.xml
+++ b/indra/newview/skins/default/xui/ru/menu_wearing_tab.xml
@@ -3,4 +3,6 @@
<menu_item_call label="Снять" name="take_off"/>
<menu_item_call label="Отсоединить" name="detach"/>
<menu_item_call label="Изменить костюм" name="edit"/>
+ <menu_item_call label="Изменить" name="edit_item"/>
+ <menu_item_call label="Показать оригинал" name="show_original"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/mime_types.xml b/indra/newview/skins/default/xui/ru/mime_types.xml
index 9b120f2f40..9c3ce00c5e 100644
--- a/indra/newview/skins/default/xui/ru/mime_types.xml
+++ b/indra/newview/skins/default/xui/ru/mime_types.xml
@@ -57,6 +57,11 @@
Поток RealTime
</label>
</scheme>
+ <scheme name="libvlc">
+ <label name="libvlc_label">
+ Медиа с поддержкой LibVLC
+ </label>
+ </scheme>
<mimetype name="blank">
<label name="blank_label">
- Ничего -
@@ -202,6 +207,11 @@
Видео (MP4)
</label>
</mimetype>
+ <mimetype name="application/octet-stream">
+ <label name="video/octet-stream">
+ Видео
+ </label>
+ </mimetype>
<mimetype name="video/quicktime">
<label name="video/quicktime_label">
Видео (QuickTime)
diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
index 5e7c2ed7d0..50931fc9b8 100644
--- a/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -330,6 +330,9 @@
Вы собираетесь запретить [COUNT] участникам доступ в группу.
<usetemplate ignoretext="Подтвердите запрет доступа участникам в группу" name="okcancelignore" notext="Отмена" yestext="Бан"/>
</notification>
+ <notification name="GroupBanUserOnBanlist">
+ Некоторым резидентам не отправлено приглашение, так как они исключены из группы.
+ </notification>
<notification name="AttachmentDrop">
Вы собираетесь сбросить свое присоединение.
Продолжить?
@@ -457,6 +460,12 @@
<notification name="ErrorEncodingSnapshot">
Ошибка при кодировке снимка.
</notification>
+ <notification name="ErrorPhotoCannotAfford">
+ Требуется L$[COST] для сохранения фото в вашем инвентаре. Купите L$ или сохраните фото на компьютере.
+ </notification>
+ <notification name="ErrorTextureCannotAfford">
+ Требуется L$[COST] для сохранения текстуры в вашем инвентаре. Купите L$ или сохраните фото на компьютере.
+ </notification>
<notification name="ErrorUploadingPostcard">
Ошибка при отправке снимка по следующей причине: [REASON]
</notification>
@@ -575,6 +584,10 @@
Удалить заметку?
<usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
</notification>
+ <notification name="LoadPreviousReportScreenshot">
+ Использовать для вашего отчета предыдущий снимок экрана?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
Не удалось сохранить жест.
Жест содержит слишком много этапов.
@@ -635,30 +648,12 @@
</url>
<usetemplate ignoretext="Оборудование моего компьютера не поддерживается" name="okcancelignore" notext="Нет" yestext="Да"/>
</notification>
- <notification name="IntelOldDriver">
- Возможно, для вашей видеокарты имеется более новый драйвер. Обновление драйвера может существенно повысить быстродействие.
-
- Проверить наличие обновления для драйвера по адресу [_URL]?
- <url name="url">
- http://www.intel.com/p/ru_RU/support/detect/graphics
- </url>
- <usetemplate ignoretext="Мой графический драйвер устарел" name="okcancelignore" notext="Нет" yestext="Да"/>
- </notification>
- <notification name="AMDOldDriver">
+ <notification name="OldGPUDriver">
Возможно, для вашей видеокарты имеется более новый драйвер. Обновление драйвера может существенно повысить быстродействие.
- Проверить наличие обновления для драйвера по адресу [_URL]?
+ Проверить наличие обновления для драйвера по адресу [URL]?
<url name="url">
- http://support.amd.com/us/Pages/AMDSupportHub.aspx
- </url>
- <usetemplate ignoretext="Мой графический драйвер устарел" name="okcancelignore" notext="Нет" yestext="Да"/>
- </notification>
- <notification name="NVIDIAOldDriver">
- Возможно, для вашей видеокарты имеется более новый драйвер. Обновление драйвера может существенно повысить быстродействие.
-
- Проверить наличие обновления для драйвера по адресу [_URL]?
- <url name="url">
- http://www.nvidia.com/Download/index.aspx?lang=ru-ru
+ [URL]
</url>
<usetemplate ignoretext="Мой графический драйвер устарел" name="okcancelignore" notext="Нет" yestext="Да"/>
</notification>
@@ -749,6 +744,9 @@
</url>
<usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
</notification>
+ <notification name="MuteLimitReached">
+ Невозможно добавить новый пункт в список заблокированных: достигнуто предельное число пунктов [MUTE_LIMIT].
+ </notification>
<notification name="UnableToLinkObjects">
Невозможно объединить эти [COUNT] объектов.
Можно объединять не более [MAX] объектов.
@@ -1379,6 +1377,11 @@
</notification>
<notification name="AgentComplexity">
Ваша [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 сложность аватара]: [AGENT_COMPLEXITY].
+ <usetemplate ignoretext="Предупреждать меня об изменении сложности аватара" name="notifyignore"/>
+ </notification>
+ <notification name="HUDComplexityWarning">
+ [HUD_REASON], возможно, отрицательно влияет на быстродействие.
+ <usetemplate ignoretext="Предупреждать о чрезмерной сложности данных в игре" name="notifyignore"/>
</notification>
<notification name="FirstRun">
Установка [APP_NAME] завершена.
@@ -1470,6 +1473,10 @@
Телепортировать всех жителей в этом регионе домой?
<usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
</notification>
+ <notification name="ChangeObjectBonusFactor">
+ Снижение бонуса за объекты после сооружения построек в регионе может вызвать возврат или удаление объектов. Действительно изменить бонус за объекты?
+ <usetemplate ignoretext="Подтвердите изменение бонусного множителя для объектов" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
<notification name="EstateObjectReturn">
Вы действительно хотите вернуть объекты, принадлежащие [USER_NAME]?
<usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
@@ -1517,6 +1524,9 @@
<notification name="OwnerCanNotBeDenied">
Нельзя добавить землевладельца в список забаненных жителей его же земли.
</notification>
+ <notification name="ProblemAddingEstateManagerBanned">
+ Невозможно добавить заблокированного жителя в список менеджеров землевладения.
+ </notification>
<notification name="CanNotChangeAppearanceUntilLoaded">
Нельзя изменять внешность, пока загружаются одежда и фигура.
</notification>
@@ -1691,6 +1701,10 @@ http://secondlife.com/download.
Открыть браузер для просмотра этого контента?
<usetemplate ignoretext="Запустить браузер для просмотра веб-страницы" name="okcancelignore" notext="Отмена" yestext="OK"/>
</notification>
+ <notification name="SystemUIScaleFactorChanged">
+ Со времени последнего запуска изменился системный коэффициент размера интерфейса. Открыть страницу настроек размера интерфейса?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
<notification name="WebLaunchJoinNow">
Перейти на [http://secondlife.com/account/ информационную панель] для управления вашим аккаунтом?
<usetemplate ignoretext="Запустить браузер для управления аккаунтом" name="okcancelignore" notext="Отмена" yestext="OK"/>
@@ -1730,10 +1744,17 @@ http://secondlife.com/download.
Хотите покинуть группу?
<usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
</notification>
+ <notification name="GroupDepart">
+ Вы покинули группу «[group_name]».
+ </notification>
<notification name="OwnerCannotLeaveGroup">
Невозможно покинуть группу. Вы не можете покинуть группу, так как вы ее последний владелец. Сначала назначьте владельцем другого участника.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="GroupDepartError">
+ Невозможно покинуть группу.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="ConfirmKick">
Вы ДЕЙСТВИТЕЛЬНО хотите выбросить всех жителей с сетки?
<usetemplate name="okcancelbuttons" notext="Отмена" yestext="Выбросить всех жителей"/>
@@ -2131,6 +2152,10 @@ http://secondlife.com/download.
Выбрано слишком много примитивов. Выберите [MAX_PRIM_COUNT] или меньше примитивов и повторите попытку.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="TooManyScriptsSelected">
+ В выбранных объектах слишком много скриптов. Выберите меньше объектов и повторите попытку.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="ProblemImportingEstateCovenant">
Проблема при импорте соглашения о землевладении.
<usetemplate name="okbutton" yestext="OK"/>
@@ -2298,6 +2323,10 @@ http://secondlife.com/download.
Не удалось выполнить оплату: объект не найден.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="PaymentBlockedButtonMismatch">
+ Платеж остановлен: уплаченная сумма не соответствует ни одной из кнопок оплаты, заданных для этого объекта.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
В этом объекте нет вещей, которые вам разрешено копировать.
</notification>
@@ -2333,6 +2362,12 @@ http://secondlife.com/download.
Это большое выделение с наборами связей. Если разъединить его, повторное соединение может отказаться невозможным. В качестве меры предосторожности попробуйте скопировать наборы связей в инвентарь.
<usetemplate ignoretext="Подтверждать при разъединении набора связей" name="okcancelignore" notext="Отмена" yestext="Разъединить"/>
</notification>
+ <notification name="HelpReportAbuseConfirm">
+ Спасибо за информирование об этой проблеме.
+Мы проверим возможные нарушения согласно вашему отчету и примем
+соответствующие меры.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="HelpReportAbuseSelectCategory">
Выберите категорию для этого уведомления о нарушении.
Категории облегчают регистрацию и обработку уведомлений.
@@ -2762,6 +2797,10 @@ http://secondlife.com/download.
<notification name="PathfindingDirty">
В регионе есть незавершенные изменения поиска пути. Если у вас есть права на строительство, восстановите регион, нажав кнопку «Восстановить регион».
</notification>
+ <notification name="PathfindingDirtyRebake">
+ В регионе есть незавершенные изменения поиска пути. Если у вас есть права на строительство, восстановите регион, нажав кнопку «Восстановить регион».
+ <usetemplate name="okbutton" yestext="Восстановить регион"/>
+ </notification>
<notification name="DynamicPathfindingDisabled">
В этом регионе не разрешен динамический поиск пути. Возможны нарушения работы скриптовых объектов с использованием вызовов LSL поиска пути.
</notification>
@@ -3269,10 +3308,12 @@ http://secondlife.com/download.
</notification>
<notification name="AppearanceToXMLFailed">
Не удалось сохранить внешность в XML.
- icon=&quot;notifytip.tga&quot;
- name=&quot;PresetNotDeleted&quot;
- type=&quot;notifytip&quot;&gt;
-Ошибка при удалении пресета [NAME].
+ </notification>
+ <notification name="PresetNotSaved">
+ Ошибка при сохранении пресета [NAME].
+ </notification>
+ <notification name="PresetNotDeleted">
+ Ошибка при удалении пресета [NAME].
</notification>
<notification name="UnableToFindHelpTopic">
Невозможно найти раздел справки для этого элемента.
@@ -3482,13 +3523,6 @@ http://secondlife.com/download.
<notification name="ForceQuitDueToLowMemory">
Через 30 секунд Second Life завершит работу: нехватка памяти.
</notification>
- <notification name="PopupAttempt">
- Всплывающее окно нельзя открыть.
- <form name="form">
- <ignore name="ignore" text="Разрешить все всплывающие окна"/>
- <button name="open" text="Открыть всплывающее окно"/>
- </form>
- </notification>
<notification name="SOCKS_NOT_PERMITTED">
Прокси SOCKS 5 &quot;[HOST]:[PORT]&quot; отклонил попытку подключения; не разрешено набором правил.
<usetemplate name="okbutton" yestext="OK"/>
@@ -3862,6 +3896,9 @@ http://secondlife.com/download.
Нельзя переместить объект «[OBJECT_NAME]» в позицию
«[OBJ_POSITION]» региона [REGION_NAME]: на этом участке недостаточно ресурсов для данного объекта.
</notification>
+ <notification name="NoParcelPermsNoObject">
+ Не удалось скопировать: у вас нет доступа к этому участку.
+ </notification>
<notification name="CantMoveObjectRegionVersion">
Нельзя переместить объект «[OBJECT_NAME]» в позицию
[OBJ_POSITION] региона [REGION_NAME]: в другом регионе работает старая версия симулятора, которая не поддерживает прием этого объекта через границу регионов.
@@ -3877,6 +3914,10 @@ http://secondlife.com/download.
<notification name="NoPermModifyObject">
У вас нет прав на изменение этого объекта
</notification>
+ <notification name="TooMuchObjectInventorySelected">
+ Выбрано слишком много объектов с большим инвентарем. Выберите меньше объектов и повторите попытку.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CantEnablePhysObjContributesToNav">
Нельзя включить физику для объекта, который относится к навигационной сетке.
</notification>
@@ -3913,6 +3954,12 @@ http://secondlife.com/download.
<notification name="CantSaveModifyAttachment">
Нельзя сохранить в содержимом объекта: это приведет к изменению разрешений прикрепленного объекта.
</notification>
+ <notification name="AttachmentHasTooMuchInventory">
+ Прикрепленные объекты содержат слишком много инвентаря. Добавление невозможно.
+ </notification>
+ <notification name="IllegalAttachment">
+ Прикрепляемый объект потребовал несуществующей точки на аватаре. Он был прикреплен к груди.
+ </notification>
<notification name="TooManyScripts">
Слишком много скриптов.
</notification>
@@ -4005,6 +4052,12 @@ http://secondlife.com/download.
<notification name="TeleportedByObjectUnknownUser">
Вы были телепортированы объектом «[OBJECT_NAME]», владелец неизвестен.
</notification>
+ <notification name="StandDeniedByObject">
+ «[OBJECT_NAME]» не позволит вам стоять в это время.
+ </notification>
+ <notification name="ResitDeniedByObject">
+ «[OBJECT_NAME]» не позволит вам сейчас сменить место.
+ </notification>
<notification name="CantCreateObjectRegionFull">
Невозможно создать запрошенный объект. Регион уже заполнен.
</notification>
@@ -4086,9 +4139,6 @@ http://secondlife.com/download.
<notification name="CantAttachNotEnoughScriptResources">
Недостаточно свободных ресурсов скриптинга для присоединения объекта!
</notification>
- <notification name="IllegalAttachment">
- Прикрепляемый объект потребовал несуществующей точки на аватаре. Он был прикреплен к груди.
- </notification>
<notification name="CantDropItemTrialUser">
Здесь нельзя сбрасывать объекты; перейдите в бесплатную область для гостей.
</notification>
@@ -4304,6 +4354,9 @@ http://secondlife.com/download.
<notification name="CantTransfterMoneyRegionDisabled">
Сейчас в этом регионе запрещен перевод денег на объекты.
</notification>
+ <notification name="DroppedMoneyTransferRequest">
+ Невозможно произвести платеж из-за нагрузки на систему.
+ </notification>
<notification name="CantPayNoAgent">
Непонятно, кому платить.
</notification>
@@ -4339,4 +4392,8 @@ http://secondlife.com/download.
Файл журнала чата занят предыдущей операцией. Повторите попытку через несколько минут или выберите чат с другим лицом.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="OutfitPhotoLoadError">
+ [REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
</notifications>
diff --git a/indra/newview/skins/default/xui/ru/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/ru/panel_outfits_inventory.xml
index 4d0e13fca2..2c02df23c0 100644
--- a/indra/newview/skins/default/xui/ru/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/ru/panel_outfits_inventory.xml
@@ -7,6 +7,7 @@
Надеть выбранные вещи
</panel.string>
<tab_container name="appearance_tabs">
+ <panel label="ГАЛЕРЕЯ КОСТЮМОВ" name="outfit_gallery_tab"/>
<panel label="МОИ КОСТЮМЫ" name="outfitslist_tab"/>
<panel label="НАДЕТО" name="cof_tab"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/ru/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/ru/panel_outfits_wearing.xml
index 7ed6bf35c0..748903b3df 100644
--- a/indra/newview/skins/default/xui/ru/panel_outfits_wearing.xml
+++ b/indra/newview/skins/default/xui/ru/panel_outfits_wearing.xml
@@ -1,5 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Wearing">
+ <panel.string name="no_attachments">
+ Нет прикрепленных объектов.
+ </panel.string>
+ <accordion name="wearables_accordion">
+ <accordion_tab name="tab_wearables" title="Носимые вещи"/>
+ <accordion_tab name="tab_temp_attachments" title="Временные прикрепленные объекты"/>
+ </accordion>
<panel name="bottom_panel">
<menu_button name="options_gear_btn" tool_tip="Показать дополнительные параметры"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
index fd13abbe27..e1b185e8ef 100644
--- a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
@@ -30,6 +30,7 @@
<combo_box.item label="Я буду загружать и устанавливать обновления вручную" name="Install_manual"/>
</combo_box>
<check_box label="Устанавливать бета-версии" name="update_willing_to_test"/>
+ <check_box label="Показать заметки о выпуске после обновления" name="update_show_release_notes"/>
<text name="Proxy Settings:">
Настройки прокси-сервера:
</text>
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index da03af055c..e44d63b3b9 100644
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -61,17 +61,34 @@ SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
<string name="AboutDriver">
Версия графического драйвера Windows: [GRAPHICS_DRIVER_VERSION]
</string>
- <string name="AboutLibs">
+ <string name="AboutOGL">
Версия OpenGL: [OPENGL_VERSION]
-
-Версия декодера J2C: [J2C_VERSION]
+ </string>
+ <string name="AboutSettings">
+ Размер окна: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
+Коррекция размера шрифта: [FONT_SIZE_ADJUSTMENT]pt
+Масштаб интерфейса: [UI_SCALE]
+Дальность отрисовки: [DRAW_DISTANCE] м
+Ширина канала: [NET_BANDWITH] кбит/с
+Коэффициент детализации: [LOD_FACTOR]
+Качество визуализации: [RENDER_QUALITY] / 7
+Расширенная модель освещения: [GPU_SHADERS]
+Память текстур: [TEXTURE_MEMORY] МБ
+Время создания VFS (кэш): [VFS_TIME]
+ </string>
+ <string name="AboutLibs">
+ Версия декодера J2C: [J2C_VERSION]
Версия драйвера звука: [AUDIO_DRIVER_VERSION]
Версия LLCEFLib/CEF: [LLCEFLIB_VERSION]
+Версия LibVLC: [LIBVLC_VERSION]
Версия голосового сервера: [VOICE_VERSION]
</string>
<string name="AboutTraffic">
Потеряно пакетов: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</string>
+ <string name="AboutTime">
+ [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]
+ </string>
<string name="ErrorFetchingServerReleaseNotesURL">
Ошибка при получении URL-адреса заметок о выпуске сервера.
</string>
@@ -1086,6 +1103,9 @@ support@secondlife.com.
<string name="TeleportYourAgent">
Телепортировать вас
</string>
+ <string name="ForceSitAvatar">
+ Заставьте аватар сесть
+ </string>
<string name="NotConnected">
Нет подключения
</string>
@@ -1934,6 +1954,27 @@ support@secondlife.com.
<string name="av_render_anyone">
Никто из окружающих участников не может отрисовать вас.
</string>
+ <string name="hud_description_total">
+ Ваши данные в игре
+ </string>
+ <string name="hud_name_with_joint">
+ [OBJ_NAME] (носится на [JNT_NAME])
+ </string>
+ <string name="hud_render_memory_warning">
+ [HUD_DETAILS] использует большой объем памяти текстур
+ </string>
+ <string name="hud_render_cost_warning">
+ [HUD_DETAILS] содержит много объемистых объектов и текстур
+ </string>
+ <string name="hud_render_heavy_textures_warning">
+ [HUD_DETAILS] содержит много больших текстур
+ </string>
+ <string name="hud_render_cramped_warning">
+ [HUD_DETAILS] содержит слишком много объектов
+ </string>
+ <string name="hud_render_textures_warning">
+ [HUD_DETAILS] содержит слишком много текстур
+ </string>
<string name="AgeYearsA">
[COUNT] год
</string>
@@ -2093,6 +2134,9 @@ support@secondlife.com.
<string name="ObjectOutOfRange">
Скрипт (объект вне области)
</string>
+ <string name="ScriptWasDeleted">
+ Скрипт (удален из инвентаря)
+ </string>
<string name="GodToolsObjectOwnedBy">
Объект [OBJECT] пользователя [OWNER]
</string>
@@ -2705,6 +2749,15 @@ support@secondlife.com.
<string name="Play Media">
Мультимедиа – воспроизведение/пауза
</string>
+ <string name="IntelDriverPage">
+ http://www.intel.com/p/en_US/support/detect/graphics
+ </string>
+ <string name="NvidiaDriverPage">
+ http://www.nvidia.com/Download/index.aspx?lang=ru-ru
+ </string>
+ <string name="AMDDriverPage">
+ http://support.amd.com/us/Pages/AMDSupportHub.aspx
+ </string>
<string name="MBCmdLineError">
Ошибка при анализе командной строки.
См.: http://wiki.secondlife.com/wiki/Client_parameters
@@ -4477,12 +4530,18 @@ support@secondlife.com.
<string name="paid_you_ldollars">
Житель [NAME] заплатил вам L$[AMOUNT] за [REASON].
</string>
+ <string name="paid_you_ldollars_gift">
+ Пользователь [NAME] заплатил вам L$[AMOUNT]: [REASON]
+ </string>
<string name="paid_you_ldollars_no_reason">
Житель [NAME] заплатил вам L$[AMOUNT].
</string>
<string name="you_paid_ldollars">
Вы заплатили жителю [NAME] L$[AMOUNT] за [REASON].
</string>
+ <string name="you_paid_ldollars_gift">
+ Вы заплатили пользователю [NAME] L$[AMOUNT]: [REASON]
+ </string>
<string name="you_paid_ldollars_no_info">
Вы заплатили L$[AMOUNT].
</string>
@@ -4495,6 +4554,9 @@ support@secondlife.com.
<string name="you_paid_failure_ldollars">
Вы не смогли заплатить пользователю [NAME] L$[AMOUNT]: [REASON].
</string>
+ <string name="you_paid_failure_ldollars_gift">
+ Вы не смогли заплатить пользователю [NAME] L$[AMOUNT]: [REASON]
+ </string>
<string name="you_paid_failure_ldollars_no_info">
Вы не смогли заплатить L$[AMOUNT]
</string>
@@ -4821,6 +4883,15 @@ support@secondlife.com.
<string name="texture_load_dimensions_error">
Нельзя загружать изображения, размер которых превышает [WIDTH]*[HEIGHT]
</string>
+ <string name="outfit_photo_load_dimensions_error">
+ Максимальный размер фото костюма [WIDTH]*[HEIGHT]. Измените размер или используйте другое изображение
+ </string>
+ <string name="outfit_photo_select_dimensions_error">
+ Максимальный размер фото костюма [WIDTH]*[HEIGHT]. Выберите другую текстуру.
+ </string>
+ <string name="outfit_photo_verify_dimensions_error">
+ Невозможно проверить размеры фото. Подождите, пока размеры фото не будут показаны в окне выбора
+ </string>
<string name="words_separator" value=","/>
<string name="server_is_down">
Несмотря на наши усилия, что-то неожиданно пошло не так.
@@ -5337,6 +5408,9 @@ support@secondlife.com.
<string name="Command_Profile_Label">
Профиль
</string>
+ <string name="Command_Report_Abuse_Label">
+ Жалоба
+ </string>
<string name="Command_Search_Label">
Поиск
</string>
@@ -5427,6 +5501,9 @@ support@secondlife.com.
<string name="Command_Profile_Tooltip">
Редактирование или просмотр вашего профиля
</string>
+ <string name="Command_Report_Abuse_Tooltip">
+ Жалоба
+ </string>
<string name="Command_Search_Tooltip">
Поиск мест, событий, людей
</string>
diff --git a/indra/newview/skins/default/xui/tr/floater_model_preview.xml b/indra/newview/skins/default/xui/tr/floater_model_preview.xml
index 29a56bae7e..3c00b67c50 100644
--- a/indra/newview/skins/default/xui/tr/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/tr/floater_model_preview.xml
@@ -245,6 +245,7 @@
</text>
<check_box label="Dış katman ağırlığını dahil et" name="upload_skin"/>
<check_box label="Eklem konumlarını dahil et" name="upload_joints"/>
+ <check_box label="Eklem konumu tanımlandıysa ölçeği kilitle" name="lock_scale_if_joint_position"/>
<text name="pelvis_offset_label">
Z kayması (avatarı kaldırmak veya indirmek için):
</text>
diff --git a/indra/newview/skins/default/xui/tr/floater_pay.xml b/indra/newview/skins/default/xui/tr/floater_pay.xml
index 63334db910..8ed8c895ef 100644
--- a/indra/newview/skins/default/xui/tr/floater_pay.xml
+++ b/indra/newview/skins/default/xui/tr/floater_pay.xml
@@ -1,9 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money">
- <string name="payee_group">Gruba Öde</string>
- <string name="payee_resident">Sakine Öde</string>
- <text name="paying_text">Ödeyeceğiniz miktar:</text>
- <text name="payee_name">Kırpmayı Kontrol İçin Test Adı Çok Uzun</text>
+ <string name="payee_group">
+ Gruba Öde
+ </string>
+ <string name="payee_resident">
+ Sakine Öde
+ </string>
+ <text name="paying_text">
+ Ödeyeceğiniz miktar:
+ </text>
+ <text name="payee_name">
+ Kırpmayı Kontrol İçin Test Adı Çok Uzun
+ </text>
+ <text name="payment_message_label">
+ Açıklama (isteğe bağlı):
+ </text>
<panel label="Ara" name="PatternsPanel">
<button label="1 L$ Öde" label_selected="1 L$ Öde" name="fastpay 1"/>
<button label="5 L$ Öde" label_selected="5 L$ Öde" name="fastpay 5"/>
@@ -11,7 +22,9 @@
<button label="20 L$ Öde" label_selected="20 L$ Öde" name="fastpay 20"/>
</panel>
<panel label="Ara" name="InputPanel">
- <text name="amount text">Diğer bir tutar:</text>
+ <text name="amount text">
+ Diğer bir tutar:
+ </text>
<button label="Öde" label_selected="Öde" name="pay btn"/>
<button label="İptal" label_selected="İptal" name="cancel btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/tr/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/tr/floater_preferences_graphics_advanced.xml
index 867e15a3ca..72c897ad47 100644
--- a/indra/newview/skins/default/xui/tr/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/tr/floater_preferences_graphics_advanced.xml
@@ -15,7 +15,7 @@
<text name="AvatarText">
Avatar
</text>
- <slider label="Maksimum karmaşıklık:" name="IndirectMaxComplexity" tool_tip="Görsel olarak karmaşık bir avatarın hangi noktadan itibaren JellyDolll olarak çizileceğini kontrol eder"/>
+ <slider label="Maksimum karmaşıklık:" name="IndirectMaxComplexity" tool_tip="Görsel olarak karmaşık bir avatarın ne zaman JellyDoll olarak çizileceğini belirler"/>
<text name="IndirectMaxComplexityText">
0
</text>
diff --git a/indra/newview/skins/default/xui/tr/floater_script_queue.xml b/indra/newview/skins/default/xui/tr/floater_script_queue.xml
index c1d98b717a..9004ad2e73 100644
--- a/indra/newview/skins/default/xui/tr/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/tr/floater_script_queue.xml
@@ -15,5 +15,11 @@
<floater.string name="NotRunning">
Çalışmıyor
</floater.string>
+ <floater.string name="Timeout">
+ Zaman aşımı: [OBJECT_NAME]
+ </floater.string>
+ <floater.string name="LoadingObjInv">
+ Şu öğe için envanter yükleniyor: [OBJECT_NAME]
+ </floater.string>
<button label="Kapat" label_selected="Kapat" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_web_content.xml b/indra/newview/skins/default/xui/tr/floater_web_content.xml
index 93491b80fb..dd5f18e2ad 100644
--- a/indra/newview/skins/default/xui/tr/floater_web_content.xml
+++ b/indra/newview/skins/default/xui/tr/floater_web_content.xml
@@ -10,5 +10,9 @@
<icon name="media_secure_lock_flag" tool_tip="Güvenli Tarama"/>
<button name="popexternal" tool_tip="Mevcut URL&apos;yi masaüstü tarayıcıda aç"/>
</layout_panel>
+ <layout_panel name="debug_controls">
+ <button name="web_test_home_page" tool_tip="Web testleri ana sayfası"/>
+ <button name="VLC Plugin Test" tool_tip="MPEG4 Video Testi"/>
+ </layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/tr/menu_attachment_other.xml b/indra/newview/skins/default/xui/tr/menu_attachment_other.xml
index d09174dcc0..cef661dbf4 100644
--- a/indra/newview/skins/default/xui/tr/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/tr/menu_attachment_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="Ara" name="Call"/>
<menu_item_call label="Gruba Davet Et" name="Invite..."/>
<menu_item_call label="İskeleti Sıfırla" name="Reset Skeleton"/>
+ <menu_item_call label="İskeleti ve Animasyonları Sıfırla" name="Reset Skeleton And Animations"/>
<menu_item_call label="Engelle" name="Avatar Mute"/>
<menu_item_call label="Raporla" name="abuse"/>
<menu_item_call label="Dondur" name="Freeze..."/>
diff --git a/indra/newview/skins/default/xui/tr/menu_attachment_self.xml b/indra/newview/skins/default/xui/tr/menu_attachment_self.xml
index 9027f09d8e..fd166ddd68 100644
--- a/indra/newview/skins/default/xui/tr/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/tr/menu_attachment_self.xml
@@ -10,6 +10,7 @@
<menu_item_call label="Şeklimi Düzenle" name="Edit My Shape"/>
<menu_item_call label="Konum Yüksekliği" name="Hover Height"/>
<menu_item_call label="İskeleti Sıfırla" name="Reset Skeleton"/>
+ <menu_item_call label="İskeleti ve Animasyonları Sıfırla" name="Reset Skeleton And Animations"/>
<menu_item_call label="Arkadaşlarım" name="Friends..."/>
<menu_item_call label="Gruplarım" name="Groups..."/>
<menu_item_call label="Profilim" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/tr/menu_avatar_other.xml b/indra/newview/skins/default/xui/tr/menu_avatar_other.xml
index 9e95b3033a..87b0d3b7eb 100644
--- a/indra/newview/skins/default/xui/tr/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/tr/menu_avatar_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="Ara" name="Call"/>
<menu_item_call label="Gruba Davet Et" name="Invite..."/>
<menu_item_call label="İskeleti Sıfırla" name="Reset Skeleton"/>
+ <menu_item_call label="İskeleti ve Animasyonları Sıfırla" name="Reset Skeleton And Animations"/>
<menu_item_call label="Engelle" name="Avatar Mute"/>
<menu_item_call label="Raporla" name="abuse"/>
<menu_item_call label="Dondur" name="Freeze..."/>
diff --git a/indra/newview/skins/default/xui/tr/menu_avatar_self.xml b/indra/newview/skins/default/xui/tr/menu_avatar_self.xml
index 3078733478..d60d894ed8 100644
--- a/indra/newview/skins/default/xui/tr/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/tr/menu_avatar_self.xml
@@ -27,6 +27,7 @@
<menu_item_call label="Şeklimi Düzenle" name="Edit My Shape"/>
<menu_item_call label="Konum Yüksekliği" name="Hover Height"/>
<menu_item_call label="İskeleti Sıfırla" name="Reset Skeleton"/>
+ <menu_item_call label="İskeleti ve Animasyonları Sıfırla" name="Reset Skeleton And Animations"/>
<menu_item_call label="Arkadaşlarım" name="Friends..."/>
<menu_item_call label="Gruplarım" name="Groups..."/>
<menu_item_call label="Profilim" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/tr/menu_login.xml b/indra/newview/skins/default/xui/tr/menu_login.xml
index a940635778..60f81c3237 100644
--- a/indra/newview/skins/default/xui/tr/menu_login.xml
+++ b/indra/newview/skins/default/xui/tr/menu_login.xml
@@ -20,13 +20,12 @@
<menu_item_check label="Hata Ayıklama Menüsünü Göster" name="Show Debug Menu"/>
<menu label="Hata ayıkla" name="Debug">
<menu_item_call label="Hata Ayıklama Ayarlarını Göster" name="Debug Settings"/>
- <menu_item_call label="KA/Renk Ayarları" name="UI/Color Settings"/>
<menu_item_call label="XKA Önizleme Aracı" name="UI Preview Tool"/>
<menu label="KA Testleri" name="UI Tests"/>
<menu_item_call label="Pencere Büyüklüğünü Ayarla..." name="Set Window Size..."/>
<menu_item_call label="Hizmet Şartlarını Göster" name="TOS"/>
<menu_item_call label="Kritik İletiyi Göster" name="Critical"/>
- <menu_item_call label="Web İçeriği Gezdiricisi Hata Ayıklama Testi" name="Web Content Floater Debug Test"/>
+ <menu_item_call label="Ortam Tarayıcı" name="Media Browser"/>
<menu label="Günlük Tutma Seviyesini Seç" name="Set Logging Level">
<menu_item_check label="Hata ayıkla" name="Debug"/>
<menu_item_check label="Bilgi" name="Info"/>
diff --git a/indra/newview/skins/default/xui/tr/menu_object_icon.xml b/indra/newview/skins/default/xui/tr/menu_object_icon.xml
index 3d5c68d9d3..57a44f02ea 100644
--- a/indra/newview/skins/default/xui/tr/menu_object_icon.xml
+++ b/indra/newview/skins/default/xui/tr/menu_object_icon.xml
@@ -2,6 +2,7 @@
<menu name="Object Icon Menu">
<menu_item_call label="Nesne Profili..." name="Object Profile"/>
<menu_item_call label="Engelle..." name="Block"/>
+ <menu_item_call label="Engellemeyi Kaldır" name="Unblock"/>
<menu_item_call label="Haritada Göster" name="show_on_map"/>
<menu_item_call label="Nesne Konumuna Işınla" name="teleport_to_object"/>
</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml b/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml
index 674041e9c9..1b73032a5d 100644
--- a/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml
@@ -3,6 +3,10 @@
<menu_item_call label="Giysi - Mevcut Dış Görünümü Değiştir" name="wear"/>
<menu_item_call label="Giysi - Mevcut Dış Görünüme Ekle" name="wear_add"/>
<menu_item_call label="Çıkar - Mevcut Dış Görünümden Kaldır" name="take_off"/>
+ <menu_item_call label="Karşıya Fotoğraf Yükleyin (10 L$)" name="upload_photo"/>
+ <menu_item_call label="Fotoğraf Seçin" name="select_photo"/>
+ <menu_item_call label="Anlık Görüntü Al" name="take_snapshot"/>
+ <menu_item_call label="Fotoğrafı Kaldır" name="remove_photo"/>
<menu label="Yeni Giysiler" name="New Clothes">
<menu_item_call label="Yeni Gömlek" name="New Shirt"/>
<menu_item_call label="Yeni Pantolon" name="New Pants"/>
@@ -27,4 +31,5 @@
<menu_item_call label="Tüm klasörleri daralt" name="collapse"/>
<menu_item_call label="Dış Görünümü Yeniden Adlandır" name="rename"/>
<menu_item_call label="Dış Görünümü Sil" name="delete_outfit"/>
+ <menu_item_check label="Klasörleri Her Zaman Ada Göre Sırala" name="sort_folders_by_name"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_friends_view.xml b/indra/newview/skins/default/xui/tr/menu_people_friends_view.xml
index 609584d6a6..65e5cd2ba6 100644
--- a/indra/newview/skins/default/xui/tr/menu_people_friends_view.xml
+++ b/indra/newview/skins/default/xui/tr/menu_people_friends_view.xml
@@ -4,5 +4,6 @@
<menu_item_check label="Duruma Göre Sırala" name="sort_status"/>
<menu_item_check label="Kişi Simgelerini Göster" name="view_icons"/>
<menu_item_check label="Verilen İzinleri Göster" name="view_permissions"/>
+ <menu_item_check label="Kullanıcı adlarını gizle" name="view_usernames"/>
<menu_item_check label="Sohbet Günlüğünü Göster..." name="view_conversation"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_nearby.xml b/indra/newview/skins/default/xui/tr/menu_people_nearby.xml
index 2d61461c91..d7f61dd2cd 100644
--- a/indra/newview/skins/default/xui/tr/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/tr/menu_people_nearby.xml
@@ -13,4 +13,6 @@
<menu_item_call label="Paylaş" name="share"/>
<menu_item_call label="Öde" name="pay"/>
<menu_item_check label="Engelle/Engeli Kaldır" name="block_unblock"/>
+ <menu_item_call label="Dondur" name="freeze"/>
+ <menu_item_call label="Çıkar" name="eject"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/tr/menu_people_nearby_view.xml
index 59ea7c145f..5c1fe09524 100644
--- a/indra/newview/skins/default/xui/tr/menu_people_nearby_view.xml
+++ b/indra/newview/skins/default/xui/tr/menu_people_nearby_view.xml
@@ -5,4 +5,5 @@
<menu_item_check label="Mesafeye Göre Sırala" name="sort_distance"/>
<menu_item_check label="Kişi Simgelerini Göster" name="view_icons"/>
<menu_item_check label="Haritayı Göster" name="view_map"/>
+ <menu_item_check label="Kullanıcı adlarını gizle" name="view_usernames"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_objectim.xml b/indra/newview/skins/default/xui/tr/menu_url_objectim.xml
index ae68669605..211ff6dcbf 100644
--- a/indra/newview/skins/default/xui/tr/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/tr/menu_url_objectim.xml
@@ -2,6 +2,7 @@
<context_menu name="Url Popup">
<menu_item_call label="Nesne Profili..." name="show_object"/>
<menu_item_call label="Engelle..." name="block_object"/>
+ <menu_item_call label="Engellemeyi Kaldır" name="unblock_object"/>
<menu_item_call label="Haritada Göster" name="show_on_map"/>
<menu_item_call label="Nesne Konumuna Işınla" name="teleport_to_object"/>
<menu_item_call label="Nesne Adını panoya kopyala" name="url_copy_label"/>
diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml
index 39636f2ebf..f55bb3fbad 100644
--- a/indra/newview/skins/default/xui/tr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml
@@ -111,11 +111,11 @@
<menu_item_call label="Bağla" name="Link"/>
<menu_item_call label="Bağlnty. Kopar" name="Unlink"/>
<menu_item_check label="Bağlantılı Parçaları Düzenle" name="Edit Linked Parts"/>
- <menu label="Bağlantılı Parçaları Seç" name="Select Linked Parts">
- <menu_item_call label="Sonraki Parçayı Seç" name="Select Next Part"/>
- <menu_item_call label="Önceki Parçayı Seç" name="Select Previous Part"/>
- <menu_item_call label="Sonraki Parçayı Dahil Et" name="Include Next Part"/>
- <menu_item_call label="Önceki Parçayı Dahil Et" name="Include Previous Part"/>
+ <menu label="Öğeleri Seçin" name="Select Elements">
+ <menu_item_call label="Sonraki Parçayı veya Yüzü Seçin" name="Select Next Part or Face"/>
+ <menu_item_call label="Önceki Parçayı veya Yüzü Seçin" name="Select Previous Part or Face"/>
+ <menu_item_call label="Sonraki Parçayı veya Yüzü Dahil Et" name="Include Next Part or Face"/>
+ <menu_item_call label="Önceki Parçayı veya Yüzü Dahil Et" name="Include Previous Part or Face"/>
</menu>
<menu_item_call label="Bağlantı kümeleri..." name="pathfinding_linkset_menu_item"/>
<menu_item_call label="Seçime Odaklan" name="Focus on Selection"/>
@@ -366,8 +366,7 @@
<menu_item_call label="Bölge Nesne Önbelleğinin Dökümünü Al" name="Dump Region Object Cache"/>
</menu>
<menu label="KA" name="UI">
- <menu_item_call label="Ortam Tarayıcı Testi" name="Web Browser Test"/>
- <menu_item_call label="Web İçerik Tarayıcısı" name="Web Content Browser"/>
+ <menu_item_call label="Ortam Tarayıcı" name="Media Browser"/>
<menu_item_call label="SelectMgr&apos;i Dökümünü Al" name="Dump SelectMgr"/>
<menu_item_call label="Envanterin Dökümünü Al" name="Dump Inventory"/>
<menu_item_call label="Zamanlayıcıların Dökümünü Al" name="Dump Timers"/>
diff --git a/indra/newview/skins/default/xui/tr/menu_wearing_tab.xml b/indra/newview/skins/default/xui/tr/menu_wearing_tab.xml
index 9796546559..1db95c17e1 100644
--- a/indra/newview/skins/default/xui/tr/menu_wearing_tab.xml
+++ b/indra/newview/skins/default/xui/tr/menu_wearing_tab.xml
@@ -3,4 +3,6 @@
<menu_item_call label="Çıkar" name="take_off"/>
<menu_item_call label="Ayır" name="detach"/>
<menu_item_call label="Dış Görünümü Düzenle" name="edit"/>
+ <menu_item_call label="Düzenle" name="edit_item"/>
+ <menu_item_call label="Orijinali Göster" name="show_original"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/mime_types.xml b/indra/newview/skins/default/xui/tr/mime_types.xml
index fa554d34fc..5b13b0059a 100644
--- a/indra/newview/skins/default/xui/tr/mime_types.xml
+++ b/indra/newview/skins/default/xui/tr/mime_types.xml
@@ -57,6 +57,11 @@
Gerçek Zamanlı Akış
</label>
</scheme>
+ <scheme name="libvlc">
+ <label name="libvlc_label">
+ LibVLC destekli ortam
+ </label>
+ </scheme>
<mimetype name="blank">
<label name="blank_label">
- Hiçbiri -
@@ -202,6 +207,11 @@
Film (MP4)
</label>
</mimetype>
+ <mimetype name="application/octet-stream">
+ <label name="video/octet-stream">
+ Film
+ </label>
+ </mimetype>
<mimetype name="video/quicktime">
<label name="video/quicktime_label">
Film (QuickTime)
diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml
index fb38486a9e..0f222d49cc 100644
--- a/indra/newview/skins/default/xui/tr/notifications.xml
+++ b/indra/newview/skins/default/xui/tr/notifications.xml
@@ -330,6 +330,9 @@ Bu yeteneklerin artık bu rolde bulunmasını istemiyorsanız, onları hemen dev
[COUNT] üyeyi grubun yasaklı listesine eklemek üzeresiniz.
<usetemplate ignoretext="Gruptan birden çok üyenin yasaklanmasını doğrulayın" name="okcancelignore" notext="İptal" yestext="Yasakla"/>
</notification>
+ <notification name="GroupBanUserOnBanlist">
+ Bazı sakinlere, gruptan çıkartıldıkları için davetiye gönderilmedi.
+ </notification>
<notification name="AttachmentDrop">
Aksesuarınızı çıkarmak üzeresiniz.
Devam etmek istediğinize emin misiniz?
@@ -457,6 +460,12 @@ Ortamı sadece bir yüze yerleştirmek için, Yüz Seç&apos;i seçin ve ardınd
<notification name="ErrorEncodingSnapshot">
Anlık görüntü kodlanırken hata oluştu.
</notification>
+ <notification name="ErrorPhotoCannotAfford">
+ Envanterinize bir fotoğraf kaydedebilmek için [COST] L$ paraya ihtiyacınız var. L$ satın alabilir veya bunun yerine fotoğrafı bilgisayarınıza kaydedebilirsiniz.
+ </notification>
+ <notification name="ErrorTextureCannotAfford">
+ Envanterinize bir doku kaydedebilmek için [COST] L$ paraya ihtiyacınız var. L$ satın alabilir veya bunun yerine fotoğrafı bilgisayarınıza kaydedebilirsiniz.
+ </notification>
<notification name="ErrorUploadingPostcard">
Aşağıdaki nedenden dolayı, anlık görüntü gönderilirken bir sorun oluştu: [REASON]
</notification>
@@ -575,6 +584,10 @@ Not: Bu işlem önbelleği temizleyecek.
Not kartı silinsin mi?
<usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
</notification>
+ <notification name="LoadPreviousReportScreenshot">
+ Raporunuz için önceki anlık görüntüyü kullanmak ister misiniz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
Mimik kaydedilemedi.
Bu mimikte çok fazla adım var.
@@ -635,30 +648,12 @@ Daha fazla bilgi için [_URL] adresini ziyaret etmek ister misiniz?
</url>
<usetemplate ignoretext="Bilgisayar donanımım desteklenmiyor" name="okcancelignore" notext="Hayır" yestext="Evet"/>
</notification>
- <notification name="IntelOldDriver">
- Grafik yonganız için muhtemelen daha yeni bir sürücü mevcut. Grafik sürücüleri güncellemek performansınızı kayda değer şekilde artırabilir.
-
- Sürücü güncellemeleri için [_URL] adresini ziyaret etmek ister misiniz?
- <url name="url">
- http://www.intel.com/p/en_US/support/detect/graphics
- </url>
- <usetemplate ignoretext="Grafik sürücüm güncel değil" name="okcancelignore" notext="Hayır" yestext="Evet"/>
- </notification>
- <notification name="AMDOldDriver">
+ <notification name="OldGPUDriver">
Grafik yonganız için muhtemelen daha yeni bir sürücü mevcut. Grafik sürücüleri güncellemek performansınızı kayda değer şekilde artırabilir.
- Sürücü güncellemeleri için [_URL] adresini ziyaret etmek ister misiniz?
+ Sürücü güncellemesi olup olmadığına bakmak için [URL] adresini ziyaret etmek ister misiniz?
<url name="url">
- http://support.amd.com/us/Pages/AMDSupportHub.aspx
- </url>
- <usetemplate ignoretext="Grafik sürücüm güncel değil" name="okcancelignore" notext="Hayır" yestext="Evet"/>
- </notification>
- <notification name="NVIDIAOldDriver">
- Grafik yonganız için muhtemelen daha yeni bir sürücü mevcut. Grafik sürücüleri güncellemek performansınızı kayda değer şekilde artırabilir.
-
- Sürücü güncellemeleri için [_URL] adresini ziyaret etmek ister misiniz?
- <url name="url">
- http://www.nvidia.com/Download/index.aspx?lang=en-us
+ [URL]
</url>
<usetemplate ignoretext="Grafik sürücüm güncel değil" name="okcancelignore" notext="Hayır" yestext="Evet"/>
</notification>
@@ -749,6 +744,9 @@ L$ satın alma ile ilgili bilgi edinmek için [_URL] adresine gidilsin mi?
</url>
<usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
</notification>
+ <notification name="MuteLimitReached">
+ [MUTE_LIMIT] giriş limitine ulaştığınız için, engelleme listesine yeni giriş eklenemiyor.
+ </notification>
<notification name="UnableToLinkObjects">
Bu [COUNT] nesne birbirine bağlanamıyor.
En fazla [MAX] nesneyi birbirine bağlayabilirsiniz.
@@ -1379,6 +1377,11 @@ Yeni bir ana konum ayarlamak isteyebilirsiniz.
</notification>
<notification name="AgentComplexity">
[https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 avatar complexity] düzeyiniz [AGENT_COMPLEXITY].
+ <usetemplate ignoretext="Avatar karmaşıklık seviyem değişince beni uyar" name="notifyignore"/>
+ </notification>
+ <notification name="HUDComplexityWarning">
+ [HUD_REASON], büyük olasılıkla performansınızı olumsuz etkiliyor.
+ <usetemplate ignoretext="BÜG karmaşıklık seviyem çok yükselince beni uyar" name="notifyignore"/>
</notification>
<notification name="FirstRun">
[APP_NAME] yüklemesi tamamlandı.
@@ -1470,6 +1473,10 @@ Lütfen sadece bir nesne seçin ve tekrar deneyin.
Bu bölgedeki tüm Sakinler ana konumlarına ışınlansın mı?
<usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
</notification>
+ <notification name="ChangeObjectBonusFactor">
+ Bir bölgede binalar inşa edildikten sonra nesne bonusunun azaltılması nesnelerin iade edilmesine veya silinmesine neden olabilir. Nesne bonusunu değiştirmek istediğinize emin misiniz?
+ <usetemplate ignoretext="Nesne bonusu faktörünü değiştirmeyi doğrulayın" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
<notification name="EstateObjectReturn">
[USER_NAME] kullanıcısının sahip olduğu tüm nesneleri iade etmek istediğinize emin misiniz?
<usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
@@ -1517,6 +1524,9 @@ Lütfen sadece bir nesne seçin ve tekrar deneyin.
<notification name="OwnerCanNotBeDenied">
Gayrimenkul sahibi, gayrimenkulün &apos;Yasaklı Sakin&apos; listesine eklenemez.
</notification>
+ <notification name="ProblemAddingEstateManagerBanned">
+ Engellenmiş sakin, gayrimenkul yöneticisi listesine eklenemez.
+ </notification>
<notification name="CanNotChangeAppearanceUntilLoaded">
Giysi ve şekil yüklenene kadar görünüm değiştirilemez.
</notification>
@@ -1691,6 +1701,10 @@ En yeni özellikleri ve düzeltmeleri görmek için sabırsızlanıyorsanız Alt
Bu içeriği görüntülemek için Web tarayıcınızı açmak istiyor musunuz?
<usetemplate ignoretext="Bir web sayfasını görüntülemek için tarayıcımı başlat" name="okcancelignore" notext="İptal" yestext="Tamam"/>
</notification>
+ <notification name="SystemUIScaleFactorChanged">
+ Sistem kullanıcı arayüzü faktörü son çalıştırmadan bu yana değişti. Kullanıcı arayüzü büyüklük değiştirme ayarları sayfasını açmak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
+ </notification>
<notification name="WebLaunchJoinNow">
Hesabınızı yönetmek için [http://secondlife.com/account/ Kontrol Paneli] adresine gidilsin mi?
<usetemplate ignoretext="Hesabımı yönetmek için tarayıcımı başlat" name="okcancelignore" notext="İptal" yestext="Tamam"/>
@@ -1730,10 +1744,17 @@ En yeni özellikleri ve düzeltmeleri görmek için sabırsızlanıyorsanız Alt
Gruptan ayrılmak istiyor musunuz?
<usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/>
</notification>
+ <notification name="GroupDepart">
+ &quot;[group_name]&quot; grubundan ayrıldınız.
+ </notification>
<notification name="OwnerCannotLeaveGroup">
Gruptan ayrılınamıyor. Gruptan ayrılamazsınız çünkü grubun son sahibisiniz. Lütfen önce sahip rolüne başka bir üye atayın.
<usetemplate name="okbutton" yestext="Tamam"/>
</notification>
+ <notification name="GroupDepartError">
+ Gruptan ayrılınamıyor.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
<notification name="ConfirmKick">
Tüm Sakinleri GERÇEKTEN ağ dışına çıkarmak istiyor musunuz?
<usetemplate name="okcancelbuttons" notext="İptal Et" yestext="Tüm Sakinleri Çıkar"/>
@@ -2131,6 +2152,10 @@ Binlerce bölgeyi değiştirecek ve alan sunucusunu kesintiye uğratacaktır.
Çok fazla prim seçilmiş. Lütfen [MAX_PRIM_COUNT] ya da daha az prim seçin ve tekrar deneyin
<usetemplate name="okbutton" yestext="Tamam"/>
</notification>
+ <notification name="TooManyScriptsSelected">
+ Seçili nesnelerde çok fazla komut dosyası var. Lütfen daha az nesne seçip tekrar deneyin
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
<notification name="ProblemImportingEstateCovenant">
Gayrimenkul sözleşmesi içeriye aktarılırken problem oluştu.
<usetemplate name="okbutton" yestext="Tamam"/>
@@ -2298,6 +2323,10 @@ Envanter öğesi/öğeleri taşınsın mı?
Ödeme başarısız: nesne bulunamadı.
<usetemplate name="okbutton" yestext="Tamam"/>
</notification>
+ <notification name="PaymentBlockedButtonMismatch">
+ Ödeme durduruldu: Ödenen fiyat, bu nesne için belirtilen ödeme düğmelerinden hiçbiriyle eşleşmiyor
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
Bu nesne içinde kopyalama izniniz olan bir öğe yok.
</notification>
@@ -2333,6 +2362,11 @@ Bu eylemi geri alamazsınız.
Bu, geniş bir bağlantı kümeleri seçimi. Bağlantıyı kaldırırsanız tekrar bağlayamayabilirsiniz. Tedbiren, envanterinizdeki bağlantı kümelerinin bir kopyasını almayı isteyebilirsiniz.
<usetemplate ignoretext="Bir bağlantı kümesinin bağının kaldırılmasını onayla" name="okcancelignore" notext="İptal" yestext="Bağlantıyı Kopar"/>
</notification>
+ <notification name="HelpReportAbuseConfirm">
+ Bu konuyu bize bildirmek için zaman ayırdığınız için teşekkür ederiz.
+Raporunuzda olası ihlalleri inceleyip gerekli önlemleri alacağız.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
<notification name="HelpReportAbuseSelectCategory">
Lütfen bu kötüye kullanım bildirimi için bir kategori seçin.
Kategori seçimi, kötüye kullanım bildirimlerini dosyalamamıza ve işleme almamıza yardımcı olmaktadır.
@@ -2762,6 +2796,10 @@ Burada uçamazsınız.
<notification name="PathfindingDirty">
Bu bölgede bekleyen yol bulma değişiklikleri var. Eğer oluşturma haklarına sahipseniz, “Bölgeyi yeniden kaydet” düğmesine tıklayarak bölgeyi yeniden kaydedebilirsiniz.
</notification>
+ <notification name="PathfindingDirtyRebake">
+ Bu bölgede bekleyen yol bulma değişiklikleri var. Eğer oluşturma haklarına sahipseniz, “Bölgeyi yeniden kaydet” düğmesine tıklayarak bölgeyi yeniden kaydedebilirsiniz.
+ <usetemplate name="okbutton" yestext="Bölgeyi yeniden kaydet"/>
+ </notification>
<notification name="DynamicPathfindingDisabled">
Bu bölgede dinamik yol bulma etkin değil. Yol bulma LSL çağrılarını kullanan komut dosyalı nesneler, bu bölgede beklendiiği gibi çalışmayabilir.
</notification>
@@ -3268,11 +3306,13 @@ Güvenliğiniz için birkaç saniye engellenecek.
Görünüm XML olarak [PATH] konumuna kaydedildi
</notification>
<notification name="AppearanceToXMLFailed">
- Görünüm XML olarak kaydedilemedi.
- icon=&quot;notifytip.tga&quot;
- name=&quot;PresetNotDeleted&quot;
- type=&quot;notifytip&quot;&gt;
-[NAME] ön ayarı silinirken hata oluştu.
+ Görünüm XML&apos;e kaydedilemedi.
+ </notification>
+ <notification name="PresetNotSaved">
+ Ön ayar ([NAME]) kaydedilirken hata oluştu.
+ </notification>
+ <notification name="PresetNotDeleted">
+ Ön ayar ([NAME]) silinirken hata oluştu.
</notification>
<notification name="UnableToFindHelpTopic">
Bu öğe için yardım başlığı bulunamıyor.
@@ -3482,13 +3522,6 @@ Görünümünüzü döndürmek için dünya üzerindeki herhangi bir yeri tıkla
<notification name="ForceQuitDueToLowMemory">
Yetersiz bellek nedeniyle SL 30 saniye içerisinde kapanacak.
</notification>
- <notification name="PopupAttempt">
- Açılır bir pencerenin açılması engellendi.
- <form name="form">
- <ignore name="ignore" text="Tüm açılır pencerelere izin ver"/>
- <button name="open" text="Açılır pencereyi aç"/>
- </form>
- </notification>
<notification name="SOCKS_NOT_PERMITTED">
SOCKS 5 proxy&apos;si &quot;[HOST]:[PORT]&quot; bağlantıyı reddetti; kural kümesi izin vermiyor.
<usetemplate name="okbutton" yestext="Tamam"/>
@@ -3859,6 +3892,9 @@ Lütfen bir dakika sonra tekrar deneyin.
<notification name="CantMoveObjectParcelResources">
[REGION_NAME] bölgesinde &apos;[OBJECT_NAME]&apos; nesnesi [OBJ_POSITION] konumuna hareket ettirilemiyor, çünkü bu parselde bu nesne için yeterli kaynak yok.
</notification>
+ <notification name="NoParcelPermsNoObject">
+ Bu parsele erişiminiz olmadığı için kopyalama işlemi yapılamadı.
+ </notification>
<notification name="CantMoveObjectRegionVersion">
[REGION_NAME] bölgesinde &apos;[OBJECT_NAME]&apos; nesnesi [OBJ_POSITION] konumuna hareket ettirilemiyor çünkü bölgede çalıştırılan eski versiyon, bölge değiştirme üzerinden bu nesnenin alınmasını desteklemiyor.
</notification>
@@ -3871,6 +3907,10 @@ Lütfen bir dakika sonra tekrar deneyin.
<notification name="NoPermModifyObject">
Bu nesneyi değiştirme izniniz yok
</notification>
+ <notification name="TooMuchObjectInventorySelected">
+ Büyük envanterli çok fazla nesne seçildi. Lütfen daha az nesne seçip tekrar deneyin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
<notification name="CantEnablePhysObjContributesToNav">
Navmesh&apos;e katkıda bulunan bir nesne için fizik etkinleştirilemez.
</notification>
@@ -3907,6 +3947,12 @@ Lütfen bir dakika sonra tekrar deneyin.
<notification name="CantSaveModifyAttachment">
Nesne içeriklerine kaydedilemedi: Bu, aksesuar izinlerini değiştirmeyi gerektirirdi.
</notification>
+ <notification name="AttachmentHasTooMuchInventory">
+ Aksesuarlarınızda çok fazla envanter olduğu için daha fazlası eklenemiyor.
+ </notification>
+ <notification name="IllegalAttachment">
+ Aksesuar avatarda var olmayan bir noktaya karşılık geliyor. Bunun yerine göğüs kısmına eklendi.
+ </notification>
<notification name="TooManyScripts">
Çok fazla komut dosyası.
</notification>
@@ -3999,6 +4045,12 @@ Lütfen bir dakika sonra tekrar deneyin.
<notification name="TeleportedByObjectUnknownUser">
Bilinmeyen bir sahibi olan &apos;[OBJECT_NAME]&apos; nesnesi tarafından ışınlandınız.
</notification>
+ <notification name="StandDeniedByObject">
+ &quot;[OBJECT_NAME]&quot; şu anda durmanıza izin vermeyecek.
+ </notification>
+ <notification name="ResitDeniedByObject">
+ &quot;[OBJECT_NAME]&quot; şu anda koltuğunuzu değiştirmenize izin vermeyecek.
+ </notification>
<notification name="CantCreateObjectRegionFull">
Talep edilen nesne oluşturulamıyor. Bölge dolu.
</notification>
@@ -4080,9 +4132,6 @@ Lütfen bir dakika sonra tekrar deneyin.
<notification name="CantAttachNotEnoughScriptResources">
Nesneyi iliştirmek için yeterli komut dosyası kaynağı mevcut değil!
</notification>
- <notification name="IllegalAttachment">
- Aksesuar avatarda var olmayan bir noktaya karşılık geliyor. Bunun yerine göğüs kısmına eklendi.
- </notification>
<notification name="CantDropItemTrialUser">
Buraya nesne düşüremezsiniz; Ücretsiz Deneme alanını deneyin.
</notification>
@@ -4298,6 +4347,9 @@ Daha küçük bir arazi parçası seçmeyi deneyin.
<notification name="CantTransfterMoneyRegionDisabled">
Nesnelere para transferleri bölgede şu anda devre dışı bırakılmış durumda.
</notification>
+ <notification name="DroppedMoneyTransferRequest">
+ Sistem yüklemesi nedeniyle, ödeme yapılamıyor.
+ </notification>
<notification name="CantPayNoAgent">
Kime ödeme yapılacağı belirlenemedi.
</notification>
@@ -4333,4 +4385,8 @@ Daha küçük bir arazi parçası seçmeyi deneyin.
Sohbet geçmişi dosyası önceki işlemi gerçekleştirmekle meşgul. Lütfen bir kaç dakika sonra tekrar deneyin veya başka bir kişiyle sohbet etmeyi deneyin.
<usetemplate name="okbutton" yestext="Tamam"/>
</notification>
+ <notification name="OutfitPhotoLoadError">
+ [REASON]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
</notifications>
diff --git a/indra/newview/skins/default/xui/tr/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/tr/panel_outfits_inventory.xml
index 550f7ebf10..c7d3d0dfed 100644
--- a/indra/newview/skins/default/xui/tr/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/tr/panel_outfits_inventory.xml
@@ -7,6 +7,7 @@
Seçilen öğeleri giy
</panel.string>
<tab_container name="appearance_tabs">
+ <panel label="DIŞ GÖRÜNÜM GALERİSİ" name="outfit_gallery_tab"/>
<panel label="DIŞ GÖRÜNÜMLERİM" name="outfitslist_tab"/>
<panel label="GİYİLEN" name="cof_tab"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/tr/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/tr/panel_outfits_wearing.xml
index 462926738f..e5a6d83166 100644
--- a/indra/newview/skins/default/xui/tr/panel_outfits_wearing.xml
+++ b/indra/newview/skins/default/xui/tr/panel_outfits_wearing.xml
@@ -1,5 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Wearing">
+ <panel.string name="no_attachments">
+ Giyilen aksesuar yok.
+ </panel.string>
+ <accordion name="wearables_accordion">
+ <accordion_tab name="tab_wearables" title="Giyilebilir Öğeler"/>
+ <accordion_tab name="tab_temp_attachments" title="Geçici aksesuarlar"/>
+ </accordion>
<panel name="bottom_panel">
<menu_button name="options_gear_btn" tool_tip="İlave seçenekleri göster"/>
</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml
index 9cfa7d61f4..235a90a245 100644
--- a/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml
@@ -24,7 +24,7 @@
<text name="BetterText">
Daha iyi
</text>
- <slider label="Avatarın Maksimum Karmaşıklığı:" name="IndirectMaxComplexity" tool_tip="Görsel olarak karmaşık bir avatarın hangi noktadan itibaren JellyDolll olarak çizileceğini kontrol eder"/>
+ <slider label="Avatarın Maksimum Karmaşıklığı:" name="IndirectMaxComplexity" tool_tip="Görsel olarak karmaşık bir avatarın ne zaman JellyDoll olarak çizileceğini belirler"/>
<text name="IndirectMaxComplexityText">
0
</text>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml
index 8f74c8ef7e..39a7ce9973 100644
--- a/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml
@@ -30,6 +30,7 @@
<combo_box.item label="Güncellemeleri manuel olarak indirip yükleyeceğim" name="Install_manual"/>
</combo_box>
<check_box label="Sürüm adaylarına güncelleme yapmaya gönüllü" name="update_willing_to_test"/>
+ <check_box label="Güncellemeden sonra Sürüm Notlarını göster" name="update_show_release_notes"/>
<text name="Proxy Settings:">
Proxy Ayarları:
</text>
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index 6aad65da22..7b4bf1fca6 100644
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -61,17 +61,34 @@ Grafik Kartı: [GRAPHICS_CARD]
<string name="AboutDriver">
Windows Grafik Sürücüsü Sürümü: [GRAPHICS_DRIVER_VERSION]
</string>
+ <string name="AboutOGL">
+ OpenGL Sürümü: [OPENGL_VERSION]
+ </string>
+ <string name="AboutSettings">
+ Pencere büyüklüğü: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
+Font Büyüklüğü Ayarı: [FONT_SIZE_ADJUSTMENT] pt
+Kullanıcı Arayüzü Ölçekleme: [UI_SCALE]
+Çizme mesafesi: [DRAW_DISTANCE] m
+Bant genişliği: [NET_BANDWITH] kbit/sn
+Ayrıntı seviyesi faktörü: [LOD_FACTOR]
+İşleme kalitesi: [RENDER_QUALITY] / 7
+Gelişmiş Aydınlatma Modeli: [GPU_SHADERS]
+Doku belleği: [TEXTURE_MEMORY]MB
+VFS (önbellek) oluşturma zamanı: [VFS_TIME]
+ </string>
<string name="AboutLibs">
- OpenGL Sürümü [OPENGL_VERSION]
-
-J2C Kod Çözücü Sürümü: [J2C_VERSION]
+ J2C Kod Çözücü Sürümü: [J2C_VERSION]
Ses Sürücüsü Sürümü: [AUDIO_DRIVER_VERSION]
LLCEFLib/CEF Sürümü: [LLCEFLIB_VERSION]
-Ses Sunucu Sürümü: [VOICE_VERSION]
+LibVLC Sürümü: [LIBVLC_VERSION]
+Ses Sunucusu Sürümü: [VOICE_VERSION]
</string>
<string name="AboutTraffic">
Kaybolan Paketler: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</string>
+ <string name="AboutTime">
+ [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]
+ </string>
<string name="ErrorFetchingServerReleaseNotesURL">
Sunucu sürümü notları URL&apos;si alınırken hata oluştu.
</string>
@@ -1086,6 +1103,9 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="TeleportYourAgent">
Sizi ışınlama
</string>
+ <string name="ForceSitAvatar">
+ Avatarınızı oturmaya zorlayın
+ </string>
<string name="NotConnected">
Bağlı Değil
</string>
@@ -1934,6 +1954,27 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="av_render_anyone">
Çevrenizdeki kimse sizi işleyemeyebilir.
</string>
+ <string name="hud_description_total">
+ BÜG&apos;niz
+ </string>
+ <string name="hud_name_with_joint">
+ [OBJ_NAME] ([JNT_NAME] üzerinde)
+ </string>
+ <string name="hud_render_memory_warning">
+ [HUD_DETAILS] yüksek miktarda doku belleği kullanıyor
+ </string>
+ <string name="hud_render_cost_warning">
+ [HUD_DETAILS] çok sayıda pahalı nesne ve doku içeriyor
+ </string>
+ <string name="hud_render_heavy_textures_warning">
+ [HUD_DETAILS] çok sayıda büyük doku içeriyor
+ </string>
+ <string name="hud_render_cramped_warning">
+ [HUD_DETAILS] çok fazla nesne içeriyor
+ </string>
+ <string name="hud_render_textures_warning">
+ [HUD_DETAILS] çok fazla doku içeriyor
+ </string>
<string name="AgeYearsA">
[COUNT] yıl
</string>
@@ -2093,6 +2134,9 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="ObjectOutOfRange">
Komut dosyası (nesne kapsam dışı)
</string>
+ <string name="ScriptWasDeleted">
+ Komut Dosyası (envanterden silindi)
+ </string>
<string name="GodToolsObjectOwnedBy">
[OWNER] mülkiyetindeki [OBJECT] nesnesi
</string>
@@ -2705,6 +2749,15 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="Play Media">
Ortamı Oynat/Durdur
</string>
+ <string name="IntelDriverPage">
+ http://www.intel.com/p/en_US/support/detect/graphics
+ </string>
+ <string name="NvidiaDriverPage">
+ http://www.nvidia.com/Download/index.aspx?lang=en-us
+ </string>
+ <string name="AMDDriverPage">
+ http://support.amd.com/us/Pages/AMDSupportHub.aspx
+ </string>
<string name="MBCmdLineError">
Komut satırı ayrıştırılırken bir hata oluştu.
Lütfen bakınız: http://wiki.secondlife.com/wiki/Client_parameters
@@ -4480,12 +4533,18 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
<string name="paid_you_ldollars">
[NAME] size [REASON] L$[AMOUNT] ödedi.
</string>
+ <string name="paid_you_ldollars_gift">
+ [NAME] size [AMOUNT] L$ ödedi: [REASON]
+ </string>
<string name="paid_you_ldollars_no_reason">
[NAME] size L$[AMOUNT] ödedi.
</string>
<string name="you_paid_ldollars">
[NAME]&apos;e [REASON] L$[AMOUNT] ödediniz.
</string>
+ <string name="you_paid_ldollars_gift">
+ [NAME] adlı kullanıcıya [AMOUNT] L$ ödediniz. [REASON]
+ </string>
<string name="you_paid_ldollars_no_info">
L$[AMOUNT] ödediniz.
</string>
@@ -4498,6 +4557,9 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
<string name="you_paid_failure_ldollars">
[REASON] [NAME]&apos;e L$[AMOUNT] ödeyemediniz.
</string>
+ <string name="you_paid_failure_ldollars_gift">
+ [NAME] adlı kullanıcıya [AMOUNT] L$ ödeyemediniz. [REASON]
+ </string>
<string name="you_paid_failure_ldollars_no_info">
L$[AMOUNT] ödeyemediniz.
</string>
@@ -4822,6 +4884,15 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
<string name="texture_load_dimensions_error">
[WIDTH]*[HEIGHT] çözünürlüğünden büyük görüntüler yüklenemez
</string>
+ <string name="outfit_photo_load_dimensions_error">
+ Maksimum dış görünüm fotoğrafı büyüklüğü: [WIDTH]*[HEIGHT]. Lütfen büyüklüğü değiştirin veya başka bir görüntü kullanın
+ </string>
+ <string name="outfit_photo_select_dimensions_error">
+ Maksimum dış görünüm fotoğrafı büyüklüğü: [WIDTH]*[HEIGHT]. Lütfen başka bir doku seçin
+ </string>
+ <string name="outfit_photo_verify_dimensions_error">
+ Fotoğraf boyutları doğrulanamıyor. Fotoğraf boyutu seçicide görüntülenene kadar lütfen bekleyin
+ </string>
<string name="words_separator" value=","/>
<string name="server_is_down">
Tüm çabalarımıza rağmen beklenmeyen bir hata meydana geldi.
@@ -5338,6 +5409,9 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin.
<string name="Command_Profile_Label">
Profil
</string>
+ <string name="Command_Report_Abuse_Label">
+ Kötüye Kullanımı Bildir
+ </string>
<string name="Command_Search_Label">
Ara
</string>
@@ -5428,6 +5502,9 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin.
<string name="Command_Profile_Tooltip">
Profilinizi düzenleyin veya görüntüleyin
</string>
+ <string name="Command_Report_Abuse_Tooltip">
+ Kötüye Kullanımı Bildir
+ </string>
<string name="Command_Search_Tooltip">
Yerler, etkinlikler ve kişiler bulmak
</string>
diff --git a/indra/newview/skins/default/xui/zh/floater_model_preview.xml b/indra/newview/skins/default/xui/zh/floater_model_preview.xml
index 817b1af88d..4223b76d90 100644
--- a/indra/newview/skins/default/xui/zh/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/zh/floater_model_preview.xml
@@ -245,6 +245,7 @@
</text>
<check_box label="包含表皮重量" name="upload_skin"/>
<check_box label="包含接點位置" name="upload_joints"/>
+ <check_box label="若接點位置已定義,就鎖住比例" name="lock_scale_if_joint_position"/>
<text name="pelvis_offset_label">
Z 偏距(升高或降低化身):
</text>
diff --git a/indra/newview/skins/default/xui/zh/floater_pay.xml b/indra/newview/skins/default/xui/zh/floater_pay.xml
index 026ead9574..5eb0fe5362 100644
--- a/indra/newview/skins/default/xui/zh/floater_pay.xml
+++ b/indra/newview/skins/default/xui/zh/floater_pay.xml
@@ -1,9 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money">
- <string name="payee_group">支付群組</string>
- <string name="payee_resident">支付居民</string>
- <text name="paying_text">你正在支付:</text>
- <text name="payee_name">測試一個長度非常非常非常長的名稱,檢查是否被切斷</text>
+ <string name="payee_group">
+ 支付群組
+ </string>
+ <string name="payee_resident">
+ 支付居民
+ </string>
+ <text name="paying_text">
+ 你正在支付:
+ </text>
+ <text name="payee_name">
+ 測試一個長度非常非常非常長的名稱,檢查是否被切斷
+ </text>
+ <text name="payment_message_label">
+ 說明(可留空):
+ </text>
<panel label="搜尋" name="PatternsPanel">
<button label="支付 L$ 1" label_selected="支付 L$ 1" name="fastpay 1"/>
<button label="支付 L$ 5" label_selected="支付 L$ 5" name="fastpay 5"/>
@@ -11,7 +22,9 @@
<button label="支付 L$ 20" label_selected="支付 L$ 20" name="fastpay 20"/>
</panel>
<panel label="搜尋" name="InputPanel">
- <text name="amount text">其他金額:</text>
+ <text name="amount text">
+ 其他金額:
+ </text>
<button label="支付" label_selected="支付" name="pay btn"/>
<button label="取消" label_selected="取消" name="cancel btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/zh/floater_preferences_graphics_advanced.xml
index 2a00bb6172..bbc16dd7e5 100644
--- a/indra/newview/skins/default/xui/zh/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/zh/floater_preferences_graphics_advanced.xml
@@ -15,7 +15,7 @@
<text name="AvatarText">
化身
</text>
- <slider label="最大複雜度:" name="IndirectMaxComplexity" tool_tip="控制在何時機下讓複雜化身呈像為 JellyDoll"/>
+ <slider label="最大複雜度:" name="IndirectMaxComplexity" tool_tip="控制在何時機下讓複雜化身呈像為「JellyDoll」"/>
<text name="IndirectMaxComplexityText">
0
</text>
diff --git a/indra/newview/skins/default/xui/zh/floater_script_queue.xml b/indra/newview/skins/default/xui/zh/floater_script_queue.xml
index 7c253aa74c..22af0dc585 100644
--- a/indra/newview/skins/default/xui/zh/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/zh/floater_script_queue.xml
@@ -15,5 +15,11 @@
<floater.string name="NotRunning">
非執行中
</floater.string>
+ <floater.string name="Timeout">
+ 逾時:[OBJECT_NAME]
+ </floater.string>
+ <floater.string name="LoadingObjInv">
+ 正載入以下物項的收納區:[OBJECT_NAME]
+ </floater.string>
<button label="關閉" label_selected="關閉" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_web_content.xml b/indra/newview/skins/default/xui/zh/floater_web_content.xml
index be6bf8bb27..5b7bcd9916 100644
--- a/indra/newview/skins/default/xui/zh/floater_web_content.xml
+++ b/indra/newview/skins/default/xui/zh/floater_web_content.xml
@@ -10,5 +10,9 @@
<icon name="media_secure_lock_flag" tool_tip="加密的瀏覽"/>
<button name="popexternal" tool_tip="在你的桌面瀏覽器中開啟目前的 URL 位址"/>
</layout_panel>
+ <layout_panel name="debug_controls">
+ <button name="web_test_home_page" tool_tip="網路測試主頁"/>
+ <button name="VLC Plugin Test" tool_tip="MPEG4影片測試"/>
+ </layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/zh/menu_attachment_other.xml b/indra/newview/skins/default/xui/zh/menu_attachment_other.xml
index 69bc4e7632..f104caeeaf 100644
--- a/indra/newview/skins/default/xui/zh/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/zh/menu_attachment_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="通話" name="Call"/>
<menu_item_call label="邀請加入群組" name="Invite..."/>
<menu_item_call label="重設骨架" name="Reset Skeleton"/>
+ <menu_item_call label="重設骨架和動作" name="Reset Skeleton And Animations"/>
<menu_item_call label="封鎖" name="Avatar Mute"/>
<menu_item_call label="回報" name="abuse"/>
<menu_item_call label="凍結" name="Freeze..."/>
diff --git a/indra/newview/skins/default/xui/zh/menu_attachment_self.xml b/indra/newview/skins/default/xui/zh/menu_attachment_self.xml
index cf56d7c86b..040ec94aad 100644
--- a/indra/newview/skins/default/xui/zh/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/zh/menu_attachment_self.xml
@@ -10,6 +10,7 @@
<menu_item_call label="編輯我的體形" name="Edit My Shape"/>
<menu_item_call label="懸浮高度" name="Hover Height"/>
<menu_item_call label="重設骨架" name="Reset Skeleton"/>
+ <menu_item_call label="重設骨架和動作" name="Reset Skeleton And Animations"/>
<menu_item_call label="我的朋友" name="Friends..."/>
<menu_item_call label="我的群組" name="Groups..."/>
<menu_item_call label="我的個人檔案" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/zh/menu_avatar_other.xml b/indra/newview/skins/default/xui/zh/menu_avatar_other.xml
index b58ec1d8cb..2e9ef8bcf1 100644
--- a/indra/newview/skins/default/xui/zh/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/zh/menu_avatar_other.xml
@@ -7,6 +7,7 @@
<menu_item_call label="通話" name="Call"/>
<menu_item_call label="邀請加入群組" name="Invite..."/>
<menu_item_call label="重設骨架" name="Reset Skeleton"/>
+ <menu_item_call label="重設骨架和動作" name="Reset Skeleton And Animations"/>
<menu_item_call label="封鎖" name="Avatar Mute"/>
<menu_item_call label="回報" name="abuse"/>
<menu_item_call label="凍結" name="Freeze..."/>
diff --git a/indra/newview/skins/default/xui/zh/menu_avatar_self.xml b/indra/newview/skins/default/xui/zh/menu_avatar_self.xml
index e2ddb57307..bad17a11b8 100644
--- a/indra/newview/skins/default/xui/zh/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/zh/menu_avatar_self.xml
@@ -27,6 +27,7 @@
<menu_item_call label="編輯我的體形" name="Edit My Shape"/>
<menu_item_call label="懸浮高度" name="Hover Height"/>
<menu_item_call label="重設骨架" name="Reset Skeleton"/>
+ <menu_item_call label="重設骨架和動作" name="Reset Skeleton And Animations"/>
<menu_item_call label="我的朋友" name="Friends..."/>
<menu_item_call label="我的群組" name="Groups..."/>
<menu_item_call label="我的個人檔案" name="Profile..."/>
diff --git a/indra/newview/skins/default/xui/zh/menu_login.xml b/indra/newview/skins/default/xui/zh/menu_login.xml
index 7ef9240e83..8dd89db7ba 100644
--- a/indra/newview/skins/default/xui/zh/menu_login.xml
+++ b/indra/newview/skins/default/xui/zh/menu_login.xml
@@ -20,13 +20,12 @@
<menu_item_check label="顯示除錯選單" name="Show Debug Menu"/>
<menu label="除錯" name="Debug">
<menu_item_call label="顯示除錯設定" name="Debug Settings"/>
- <menu_item_call label="UI / 顏色 設定" name="UI/Color Settings"/>
<menu_item_call label="XUI 預覽工具" name="UI Preview Tool"/>
<menu label="UI 測試" name="UI Tests"/>
<menu_item_call label="設定視窗大小..." name="Set Window Size..."/>
<menu_item_call label="顯示 TOS" name="TOS"/>
<menu_item_call label="顯示嚴重訊息" name="Critical"/>
- <menu_item_call label="網頁內容浮動視窗除錯測試" name="Web Content Floater Debug Test"/>
+ <menu_item_call label="媒體瀏覽器" name="Media Browser"/>
<menu label="設定記錄細節" name="Set Logging Level">
<menu_item_check label="除錯" name="Debug"/>
<menu_item_check label="資訊" name="Info"/>
diff --git a/indra/newview/skins/default/xui/zh/menu_object_icon.xml b/indra/newview/skins/default/xui/zh/menu_object_icon.xml
index 9655732f2e..d0a3457ae8 100644
--- a/indra/newview/skins/default/xui/zh/menu_object_icon.xml
+++ b/indra/newview/skins/default/xui/zh/menu_object_icon.xml
@@ -2,6 +2,7 @@
<menu name="Object Icon Menu">
<menu_item_call label="物件檔案..." name="Object Profile"/>
<menu_item_call label="封鎖…" name="Block"/>
+ <menu_item_call label="解除封鎖" name="Unblock"/>
<menu_item_call label="顯示在地圖上" name="show_on_map"/>
<menu_item_call label="瞬間傳送到物件位置" name="teleport_to_object"/>
</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml b/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml
index 258d0d6b20..124598a098 100644
--- a/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml
@@ -3,6 +3,10 @@
<menu_item_call label="穿上 - 取代目前裝扮" name="wear"/>
<menu_item_call label="穿上 - 添加到目前裝扮" name="wear_add"/>
<menu_item_call label="脫下 - 由目前裝扮移除" name="take_off"/>
+ <menu_item_call label="上傳相片(L$10)" name="upload_photo"/>
+ <menu_item_call label="選擇相片" name="select_photo"/>
+ <menu_item_call label="拍攝快照" name="take_snapshot"/>
+ <menu_item_call label="移除相片" name="remove_photo"/>
<menu label="新衣服" name="New Clothes">
<menu_item_call label="新襯衫" name="New Shirt"/>
<menu_item_call label="新褲子" name="New Pants"/>
@@ -27,4 +31,5 @@
<menu_item_call label="摺疊全部資料夾" name="collapse"/>
<menu_item_call label="裝扮更名" name="rename"/>
<menu_item_call label="刪除裝扮" name="delete_outfit"/>
+ <menu_item_check label="總是由名稱排序資料夾" name="sort_folders_by_name"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_friends_view.xml b/indra/newview/skins/default/xui/zh/menu_people_friends_view.xml
index 4251238fd9..9e27520d36 100644
--- a/indra/newview/skins/default/xui/zh/menu_people_friends_view.xml
+++ b/indra/newview/skins/default/xui/zh/menu_people_friends_view.xml
@@ -4,5 +4,6 @@
<menu_item_check label="依狀態排序" name="sort_status"/>
<menu_item_check label="察看人群圖示" name="view_icons"/>
<menu_item_check label="察看許可權限" name="view_permissions"/>
+ <menu_item_check label="隱藏使用者名稱" name="view_usernames"/>
<menu_item_check label="檢視交談記錄……" name="view_conversation"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby.xml
index d25adaf8fb..4ad755c028 100644
--- a/indra/newview/skins/default/xui/zh/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/zh/menu_people_nearby.xml
@@ -13,4 +13,6 @@
<menu_item_call label="分享" name="share"/>
<menu_item_call label="支付" name="pay"/>
<menu_item_check label="封鎖/不再封鎖" name="block_unblock"/>
+ <menu_item_call label="凍結" name="freeze"/>
+ <menu_item_call label="踢出" name="eject"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby_view.xml
index 9bc5638472..9c82e20497 100644
--- a/indra/newview/skins/default/xui/zh/menu_people_nearby_view.xml
+++ b/indra/newview/skins/default/xui/zh/menu_people_nearby_view.xml
@@ -5,4 +5,5 @@
<menu_item_check label="依距離排序" name="sort_distance"/>
<menu_item_check label="察看人群圖示" name="view_icons"/>
<menu_item_check label="察看地圖" name="view_map"/>
+ <menu_item_check label="隱藏使用者名稱" name="view_usernames"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_objectim.xml b/indra/newview/skins/default/xui/zh/menu_url_objectim.xml
index ac366f92ef..c830e5554b 100644
--- a/indra/newview/skins/default/xui/zh/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/zh/menu_url_objectim.xml
@@ -2,6 +2,7 @@
<context_menu name="Url Popup">
<menu_item_call label="物件檔案..." name="show_object"/>
<menu_item_call label="封鎖…" name="block_object"/>
+ <menu_item_call label="解除封鎖" name="unblock_object"/>
<menu_item_call label="顯示在地圖上" name="show_on_map"/>
<menu_item_call label="瞬間傳送到物件位置" name="teleport_to_object"/>
<menu_item_call label="覆製物件名稱到剪貼簿" name="url_copy_label"/>
diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml
index f2971491ac..3868646050 100644
--- a/indra/newview/skins/default/xui/zh/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml
@@ -111,11 +111,11 @@
<menu_item_call label="聯結" name="Link"/>
<menu_item_call label="取消聯結" name="Unlink"/>
<menu_item_check label="編輯聯結部位" name="Edit Linked Parts"/>
- <menu label="選擇聯結部位" name="Select Linked Parts">
- <menu_item_call label="選擇下一部位" name="Select Next Part"/>
- <menu_item_call label="選擇上一部位" name="Select Previous Part"/>
- <menu_item_call label="包括下一部位" name="Include Next Part"/>
- <menu_item_call label="包括上一部位" name="Include Previous Part"/>
+ <menu label="選擇元素" name="Select Elements">
+ <menu_item_call label="選擇下一部位或臉" name="Select Next Part or Face"/>
+ <menu_item_call label="選擇上一部位或臉" name="Select Previous Part or Face"/>
+ <menu_item_call label="包括下一部位或臉" name="Include Next Part or Face"/>
+ <menu_item_call label="包括上一部位或臉" name="Include Previous Part or Face"/>
</menu>
<menu_item_call label="聯結集…" name="pathfinding_linkset_menu_item"/>
<menu_item_call label="聚焦於所選部位" name="Focus on Selection"/>
@@ -366,8 +366,7 @@
<menu_item_call label="傾印地區物件快取" name="Dump Region Object Cache"/>
</menu>
<menu label="使用者界面" name="UI">
- <menu_item_call label="媒體瀏覽器測試" name="Web Browser Test"/>
- <menu_item_call label="網頁內容瀏覽器" name="Web Content Browser"/>
+ <menu_item_call label="媒體瀏覽器" name="Media Browser"/>
<menu_item_call label="傾印 SelectMgr" name="Dump SelectMgr"/>
<menu_item_call label="傾印收納區" name="Dump Inventory"/>
<menu_item_call label="傾印碼錶" name="Dump Timers"/>
diff --git a/indra/newview/skins/default/xui/zh/menu_wearing_tab.xml b/indra/newview/skins/default/xui/zh/menu_wearing_tab.xml
index c7d2853995..dc9adcbd25 100644
--- a/indra/newview/skins/default/xui/zh/menu_wearing_tab.xml
+++ b/indra/newview/skins/default/xui/zh/menu_wearing_tab.xml
@@ -3,4 +3,6 @@
<menu_item_call label="脫下" name="take_off"/>
<menu_item_call label="卸下" name="detach"/>
<menu_item_call label="編輯裝扮" name="edit"/>
+ <menu_item_call label="編輯" name="edit_item"/>
+ <menu_item_call label="顯示原件" name="show_original"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/mime_types.xml b/indra/newview/skins/default/xui/zh/mime_types.xml
index 8967475abb..f4b6822778 100644
--- a/indra/newview/skins/default/xui/zh/mime_types.xml
+++ b/indra/newview/skins/default/xui/zh/mime_types.xml
@@ -57,6 +57,11 @@
即時串流
</label>
</scheme>
+ <scheme name="libvlc">
+ <label name="libvlc_label">
+ LibVLC支持的媒體
+ </label>
+ </scheme>
<mimetype name="blank">
<label name="blank_label">
- 無 -
@@ -202,6 +207,11 @@
視頻(MP4)
</label>
</mimetype>
+ <mimetype name="application/octet-stream">
+ <label name="video/octet-stream">
+ 影片
+ </label>
+ </mimetype>
<mimetype name="video/quicktime">
<label name="video/quicktime_label">
視頻(QuickTime)
diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml
index 463afab1c0..5c794afd65 100644
--- a/indra/newview/skins/default/xui/zh/notifications.xml
+++ b/indra/newview/skins/default/xui/zh/notifications.xml
@@ -330,6 +330,9 @@
你即將禁止[COUNT]個人留在群組。
<usetemplate ignoretext="確定要禁止多名成員續留此群組" name="okcancelignore" notext="取消" yestext="禁止"/>
</notification>
+ <notification name="GroupBanUserOnBanlist">
+ 有些居民因為被封鎖所以沒有收到邀請。
+ </notification>
<notification name="AttachmentDrop">
你即將卸除你的附件。
你確定你要繼續?
@@ -457,6 +460,12 @@
<notification name="ErrorEncodingSnapshot">
為快照編碼時出錯。
</notification>
+ <notification name="ErrorPhotoCannotAfford">
+ 你需要L$[COST]才能把照片存入你的收納區。 你可以購買L$,或者不存入收納區,而把相片存到你的電腦。
+ </notification>
+ <notification name="ErrorTextureCannotAfford">
+ 你需要L$[COST]才能把材質存入你的收納區。 你可以購買L$,或者不存入收納區,而把相片存到你的電腦。
+ </notification>
<notification name="ErrorUploadingPostcard">
發送快照時出問題,原因:[REASON]
</notification>
@@ -575,6 +584,10 @@
刪除記事卡?
<usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
</notification>
+ <notification name="LoadPreviousReportScreenshot">
+ 你要使用之前的螢幕截圖來舉報嗎?
+ <usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
+ </notification>
<notification name="GestureSaveFailedTooManySteps">
姿勢儲存失敗。
這個姿勢步驟太多。
@@ -635,32 +648,14 @@
</url>
<usetemplate ignoretext="我的電腦硬體並不支援" name="okcancelignore" notext="否" yestext="是"/>
</notification>
- <notification name="IntelOldDriver">
- 你的顯示卡很可能有新版的驅動程式。 更新顯示驅動程式會大幅改善性能。
-
- 前往 [_URL] 察看是否有新版驅動程式?
- <url name="url">
- http://www.intel.com/p/en_US/support/detect/graphics
- </url>
- <usetemplate ignoretext="我的顯示驅動程式太老舊" name="okcancelignore" notext="否" yestext="是"/>
- </notification>
- <notification name="AMDOldDriver">
- 你的顯示卡很可能有新版的驅動程式。 更新顯示驅動程式會大幅改善性能。
-
- 前往 [_URL] 察看是否有新版驅動程式?
- <url name="url">
- http://support.amd.com/us/Pages/AMDSupportHub.aspx
- </url>
- <usetemplate ignoretext="我的顯示驅動程式太老舊" name="okcancelignore" notext="否" yestext="是"/>
- </notification>
- <notification name="NVIDIAOldDriver">
+ <notification name="OldGPUDriver">
你的顯示卡很可能有新版的驅動程式。 更新顯示驅動程式會大幅改善性能。
- 前往 [_URL] 察看是否有新版驅動程式?
+ 前往[URL]察看是否有新版驅動程式?
<url name="url">
- http://www.nvidia.com/Download/index.aspx?lang=tw
+ [URL]
</url>
- <usetemplate ignoretext="我的顯示驅動程式太老舊" name="okcancelignore" notext="否" yestext="是"/>
+ <usetemplate ignoretext="我的顯示驅動程式太老舊" name="okcancelignore" notext="取消" yestext="是"/>
</notification>
<notification name="UnknownGPU">
你的系統含有一個 [APP_NAME] 無法辨認的顯像卡。
@@ -749,6 +744,9 @@
</url>
<usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
</notification>
+ <notification name="MuteLimitReached">
+ 封鎖清單名額無法增加,因為你已達[MUTE_LIMIT]名的上限。
+ </notification>
<notification name="UnableToLinkObjects">
無法聯結這 [COUNT] 個物件。
你最多可以聯結 [MAX] 個物件。
@@ -1372,6 +1370,11 @@
</notification>
<notification name="AgentComplexity">
你的[https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 化身複雜度]是[AGENT_COMPLEXITY]。
+ <usetemplate ignoretext="發出警告,告知我化身複雜度有了改變" name="notifyignore"/>
+ </notification>
+ <notification name="HUDComplexityWarning">
+ [HUD_REASON],可能負面影響你的性能。
+ <usetemplate ignoretext="警告我HUD的複雜度是否可能過高" name="notifyignore"/>
</notification>
<notification name="FirstRun">
[APP_NAME] 安裝完成。
@@ -1463,6 +1466,10 @@ SHA1 指紋:[MD5_DIGEST]
確定要強制瞬間傳送這地區所有居民回家?
<usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
</notification>
+ <notification name="ChangeObjectBonusFactor">
+ 在地區內完成建製後再降低物件負荷倍數,可能導致物件被送返或刪除。 繼續要變更物件負荷倍數?
+ <usetemplate ignoretext="確定變更物件負荷倍數" name="okcancelignore" notext="取消" yestext="確定"/>
+ </notification>
<notification name="EstateObjectReturn">
你確定要送返 [USER_NAME] 所擁有的物件?
<usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
@@ -1510,6 +1517,9 @@ SHA1 指紋:[MD5_DIGEST]
<notification name="OwnerCanNotBeDenied">
無法添加領地所有人到領地的 &apos;被封鎖的居民&apos; 名單中。
</notification>
+ <notification name="ProblemAddingEstateManagerBanned">
+ 無法把被封鎖的居民加入領地的管理人名單。
+ </notification>
<notification name="CanNotChangeAppearanceUntilLoaded">
無法變更外觀,直到服裝與體形下載完畢。
</notification>
@@ -1681,6 +1691,10 @@ SHA1 指紋:[MD5_DIGEST]
你確定要開啟網頁瀏覽器去察看這個內容?
<usetemplate ignoretext="啟動我的網頁瀏覽器去察看網頁" name="okcancelignore" notext="取消" yestext="確定"/>
</notification>
+ <notification name="SystemUIScaleFactorChanged">
+ 系統使用者介面的尺寸倍數自從上次執行後已經改變。 你想要開啟使用者介面尺寸調整的設定頁嗎?
+ <usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
+ </notification>
<notification name="WebLaunchJoinNow">
前往你的[http://secondlife.com/account/ 塗鴉牆]以進行管理你的帳戶?
<usetemplate ignoretext="啟動我的瀏覽器以管理我的帳戶" name="okcancelignore" notext="取消" yestext="確定"/>
@@ -1720,10 +1734,17 @@ SHA1 指紋:[MD5_DIGEST]
是否要離開群組?
<usetemplate name="okcancelbuttons" notext="取消" yestext="確定"/>
</notification>
+ <notification name="GroupDepart">
+ 你已經離開「[group_name]」群組。
+ </notification>
<notification name="OwnerCannotLeaveGroup">
無法離開群組。 你是此群組僅存的所有人,不得離開群組。 請先把所有人職銜指派給另一人。
<usetemplate name="okbutton" yestext="確定"/>
</notification>
+ <notification name="GroupDepartError">
+ 無法離開群組。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
<notification name="ConfirmKick">
你確定要踢出這網格內的全部居民?
<usetemplate name="okcancelbuttons" notext="取消" yestext="踢出全部居民"/>
@@ -2121,6 +2142,10 @@ SHA1 指紋:[MD5_DIGEST]
選擇了太多項的幾何元件。 請至多選擇 [MAX_PRIM_COUNT] 項幾何元件,再試一次。
<usetemplate name="okbutton" yestext="確定"/>
</notification>
+ <notification name="TooManyScriptsSelected">
+ 選取的物件腳本太多。 請減少選取的物件數,再試一次。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
<notification name="ProblemImportingEstateCovenant">
匯入領地契約時出問題。
<usetemplate name="okbutton" yestext="確定"/>
@@ -2288,6 +2313,10 @@ SHA1 指紋:[MD5_DIGEST]
付款失敗:找不到物件。
<usetemplate name="okbutton" yestext="確定"/>
</notification>
+ <notification name="PaymentBlockedButtonMismatch">
+ 付款中止:所付價格與此物件設定的任何付款按鈕皆不相符。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
<notification name="OpenObjectCannotCopy">
這物件中沒有任何准許你複製的物項。
</notification>
@@ -2323,6 +2352,12 @@ SHA1 指紋:[MD5_DIGEST]
這是一組包含聯結集的巨大選取項。 一旦你取消它的聯結,很可能不能再重新聯結。 為防萬一,建議你把聯結集複製到收納區。
<usetemplate ignoretext="取消聯結集聯結時,跟我確認" name="okcancelignore" notext="取消" yestext="取消聯結"/>
</notification>
+ <notification name="HelpReportAbuseConfirm">
+ 謝謝你撥冗提報問題。
+我們會查核你的舉報內容決定有無違規情事,並
+採取適當行動。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
<notification name="HelpReportAbuseSelectCategory">
請選擇適合這次違規舉報的類別。
選對類別可以幫助我們歸類並處理違規舉報。
@@ -2751,6 +2786,10 @@ SHA1 指紋:[MD5_DIGEST]
<notification name="PathfindingDirty">
這地區的尋徑功能有所變更,待儲存。 如果你有建製權,你可以點按「重新產出地區」按鈕重新產出地區。
</notification>
+ <notification name="PathfindingDirtyRebake">
+ 這地區的尋徑功能有所變更,待儲存。 如果你有建製權,你可以點按「重新產出地區」按鈕重新產出地區。
+ <usetemplate name="okbutton" yestext="重新產出地區"/>
+ </notification>
<notification name="DynamicPathfindingDisabled">
這地區並未啟用動態尋徑。 使用尋徑 LSL 呼叫的帶腳本物件,在此地區可能無法正常運作。
</notification>
@@ -3258,10 +3297,12 @@ SHA1 指紋:[MD5_DIGEST]
</notification>
<notification name="AppearanceToXMLFailed">
將外觀存為XML失敗。
- icon=&quot;notifytip.tga&quot;
- name=&quot;PresetNotDeleted&quot;
- type=&quot;notifytip&quot;&gt;
-刪除預設名稱[NAME]時出錯。
+ </notification>
+ <notification name="PresetNotSaved">
+ 儲存預設名稱[NAME]時出錯。
+ </notification>
+ <notification name="PresetNotDeleted">
+ 刪除預設名稱[NAME]時出錯。
</notification>
<notification name="UnableToFindHelpTopic">
找不到這個元件的幫助主題。
@@ -3471,13 +3512,6 @@ SHA1 指紋:[MD5_DIGEST]
<notification name="ForceQuitDueToLowMemory">
記憶體不足,第二人生將於 30 秒後關閉離開。
</notification>
- <notification name="PopupAttempt">
- 一個突顯式視窗開啟時被阻擋。
- <form name="form">
- <ignore name="ignore" text="啟用全部的突顯式視窗"/>
- <button name="open" text="開啟突顯式視窗"/>
- </form>
- </notification>
<notification name="SOCKS_NOT_PERMITTED">
SOCKS 5 代理伺服器 &quot;[HOST]:[PORT]&quot; 拒絕連通,規則集不允許。
<usetemplate name="okbutton" yestext="確定"/>
@@ -3852,6 +3886,9 @@ SHA1 指紋:[MD5_DIGEST]
無法移動 &apos;[OBJECT_NAME]&apos; 物件到
[REGION_NAME] 地區的 [OBJ_POSITION],因為此地段資源不足容納此物件。
</notification>
+ <notification name="NoParcelPermsNoObject">
+ 複製失敗,因爲你無權出入該地段。
+ </notification>
<notification name="CantMoveObjectRegionVersion">
無法移動 &apos;[OBJECT_NAME]&apos; 物件到
[REGION_NAME] 地區的 [OBJ_POSITION],因為該地區所執行的軟體版本過舊,不支援跨地區接受這個物件。
@@ -3867,6 +3904,10 @@ SHA1 指紋:[MD5_DIGEST]
<notification name="NoPermModifyObject">
你無權變更該物件
</notification>
+ <notification name="TooMuchObjectInventorySelected">
+ 選取的物件包含太多大的收納區。 請減少選取的物件數,再試一次。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
<notification name="CantEnablePhysObjContributesToNav">
對導航網面有貢獻的物件,無法啟用物理。
</notification>
@@ -3903,6 +3944,12 @@ SHA1 指紋:[MD5_DIGEST]
<notification name="CantSaveModifyAttachment">
無法儲存到物件內容:這麼做將修改附件的權限。
</notification>
+ <notification name="AttachmentHasTooMuchInventory">
+ 你的附件已經包含太多收納區內容,不能再增加。
+ </notification>
+ <notification name="IllegalAttachment">
+ 這個附件要求了化身上不存在的點。 因此已將該附件附著到胸部。
+ </notification>
<notification name="TooManyScripts">
腳本太多。
</notification>
@@ -3995,6 +4042,12 @@ SHA1 指紋:[MD5_DIGEST]
<notification name="TeleportedByObjectUnknownUser">
你已成功被某未知用戶擁有的物件 &apos;[OBJECT_NAME]&apos; 瞬間傳送。
</notification>
+ <notification name="StandDeniedByObject">
+ 「[OBJECT_NAME]」將使你無法在此時站立。
+ </notification>
+ <notification name="ResitDeniedByObject">
+ 「[OBJECT_NAME]」此時無法允許你改變座位。
+ </notification>
<notification name="CantCreateObjectRegionFull">
無法建立要求的物件。 地區已滿載。
</notification>
@@ -4076,9 +4129,6 @@ SHA1 指紋:[MD5_DIGEST]
<notification name="CantAttachNotEnoughScriptResources">
腳本資源不足,無法附著物件!
</notification>
- <notification name="IllegalAttachment">
- 這個附件要求了化身上不存在的點。 因此已將該附件附著到胸部。
- </notification>
<notification name="CantDropItemTrialUser">
你無法在此卸除物件,請到「自由嘗試」區域再試。
</notification>
@@ -4294,6 +4344,9 @@ SHA1 指紋:[MD5_DIGEST]
<notification name="CantTransfterMoneyRegionDisabled">
此地區目前未啟用轉移金錢給物件的功能。
</notification>
+ <notification name="DroppedMoneyTransferRequest">
+ 系統負荷太重,無法進行付款。
+ </notification>
<notification name="CantPayNoAgent">
無法決定付款給誰。
</notification>
@@ -4329,4 +4382,8 @@ SHA1 指紋:[MD5_DIGEST]
聊天紀錄檔案還在處理前一個動作。 請稍候再試,或請換一個聊天對象。
<usetemplate name="okbutton" yestext="確定"/>
</notification>
+ <notification name="OutfitPhotoLoadError">
+ [REASON]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
</notifications>
diff --git a/indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml
index 8dd93543c0..9b9a79a509 100644
--- a/indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml
@@ -7,6 +7,7 @@
穿上所選擇的物件
</panel.string>
<tab_container name="appearance_tabs">
+ <panel label="裝扮陳列" name="outfit_gallery_tab"/>
<panel label="我的裝扮" name="outfitslist_tab"/>
<panel label="目前穿著" name="cof_tab"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/zh/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/zh/panel_outfits_wearing.xml
index 693cdcdeca..e3c62cfccf 100644
--- a/indra/newview/skins/default/xui/zh/panel_outfits_wearing.xml
+++ b/indra/newview/skins/default/xui/zh/panel_outfits_wearing.xml
@@ -1,5 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Wearing">
+ <panel.string name="no_attachments">
+ 未穿著任何附件。
+ </panel.string>
+ <accordion name="wearables_accordion">
+ <accordion_tab name="tab_wearables" title="可穿裝扮"/>
+ <accordion_tab name="tab_temp_attachments" title="暫時附件"/>
+ </accordion>
<panel name="bottom_panel">
<menu_button name="options_gear_btn" tool_tip="顯示額外選項"/>
</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml
index b5c36668f6..4eef624910 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml
@@ -24,7 +24,7 @@
<text name="BetterText">
最佳
</text>
- <slider label="化身最大複雜度:" name="IndirectMaxComplexity" tool_tip="控制在何時機下讓複雜化身呈像為 JellyDoll"/>
+ <slider label="化身最大複雜度:" name="IndirectMaxComplexity" tool_tip="控制在何時機下讓複雜化身呈像為「JellyDoll」"/>
<text name="IndirectMaxComplexityText">
0
</text>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
index 942bd27140..bdf980218c 100644
--- a/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
@@ -30,6 +30,7 @@
<combo_box.item label="讓我自己手動下載並安裝" name="Install_manual"/>
</combo_box>
<check_box label="願意在更新時搶先試用釋出候選版" name="update_willing_to_test"/>
+ <check_box label="更新後顯示發行記事" name="update_show_release_notes"/>
<text name="Proxy Settings:">
代理伺服器設定:
</text>
diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
index 5ce5adf3f0..ec08c9f91e 100644
--- a/indra/newview/skins/default/xui/zh/strings.xml
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -61,17 +61,34 @@
<string name="AboutDriver">
Windows 顯示驅動程式版本:[GRAPHICS_DRIVER_VERSION]
</string>
+ <string name="AboutOGL">
+ OpenGL版本:[OPENGL_VERSION]
+ </string>
+ <string name="AboutSettings">
+ 視窗大小:[WINDOW_WIDTH]x[WINDOW_HEIGHT]
+字體大小調整:[FONT_SIZE_ADJUSTMENT]點
+使用者介面比例:[UI_SCALE]
+描繪距離:[DRAW_DISTANCE]公尺
+頻寬:[NET_BANDWITH]千位元/秒
+細節層次率:[LOD_FACTOR]
+呈像品質:[RENDER_QUALITY] / 7
+進階照明模型:[GPU_SHADERS]
+材質記憶體:[TEXTURE_MEMORY]MB
+VFS(快取)建立時間:[VFS_TIME]
+ </string>
<string name="AboutLibs">
- OpenGL 版本:[OPENGL_VERSION]
-
-J2C 解碼器版本: [J2C_VERSION]
+ J2C 解碼器版本: [J2C_VERSION]
音效驅動程式版本: [AUDIO_DRIVER_VERSION]
LLCEFLib/CEF版本:[LLCEFLIB_VERSION]
+LibVLC版本:[LIBVLC_VERSION]N]
語音伺服器版本: [VOICE_VERSION]
</string>
<string name="AboutTraffic">
封包丟失:[PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</string>
+ <string name="AboutTime">
+ [month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]
+ </string>
<string name="ErrorFetchingServerReleaseNotesURL">
擷取伺服器版本說明 URL 時出錯。
</string>
@@ -1081,6 +1098,9 @@ http://secondlife.com/viewer-access-faq
<string name="TeleportYourAgent">
瞬間傳送你本人
</string>
+ <string name="ForceSitAvatar">
+ 強迫你的化身坐下
+ </string>
<string name="NotConnected">
未聯接
</string>
@@ -1929,6 +1949,27 @@ http://secondlife.com/viewer-access-faq
<string name="av_render_anyone">
你恐怕不能呈像給你周遭的任何人。
</string>
+ <string name="hud_description_total">
+ 你的擡頭顯示
+ </string>
+ <string name="hud_name_with_joint">
+ [OBJ_NAME](穿戴於[JNT_NAME])
+ </string>
+ <string name="hud_render_memory_warning">
+ [HUD_DETAILS]使用了很多材質記憶體
+ </string>
+ <string name="hud_render_cost_warning">
+ [HUD_DETAILS]包含很多耗用性能的物件和材質
+ </string>
+ <string name="hud_render_heavy_textures_warning">
+ [HUD_DETAILS] 包含很多大的材質
+ </string>
+ <string name="hud_render_cramped_warning">
+ [HUD_DETAILS]包含過多物件
+ </string>
+ <string name="hud_render_textures_warning">
+ [HUD_DETAILS]包含太多材質
+ </string>
<string name="AgeYearsA">
[COUNT] 年
</string>
@@ -2088,6 +2129,9 @@ http://secondlife.com/viewer-access-faq
<string name="ObjectOutOfRange">
腳本(物件超出範圍)
</string>
+ <string name="ScriptWasDeleted">
+ 腳本(已從收納區刪除)
+ </string>
<string name="GodToolsObjectOwnedBy">
物件 [OBJECT] 為 [OWNER] 所擁有
</string>
@@ -2700,6 +2744,15 @@ http://secondlife.com/viewer-access-faq
<string name="Play Media">
播放/暫停媒體
</string>
+ <string name="IntelDriverPage">
+ http://www.intel.com/p/en_US/support/detect/graphics
+ </string>
+ <string name="NvidiaDriverPage">
+ http://www.nvidia.com/Download/index.aspx?lang=tw
+ </string>
+ <string name="AMDDriverPage">
+ http://support.amd.com/us/Pages/AMDSupportHub.aspx
+ </string>
<string name="MBCmdLineError">
解析命令列時發現錯誤。
請參閱: http://wiki.secondlife.com/wiki/Client_parameters
@@ -4475,12 +4528,18 @@ http://secondlife.com/viewer-access-faq
<string name="paid_you_ldollars">
[NAME] 支付你 L$[AMOUNT]([REASON])。
</string>
+ <string name="paid_you_ldollars_gift">
+ [NAME]支付你L$[AMOUNT]:([REASON])
+ </string>
<string name="paid_you_ldollars_no_reason">
[NAME] 支付你 L$[AMOUNT]。
</string>
<string name="you_paid_ldollars">
你支付 L$[AMOUNT] 給 [NAME]([REASON])。
</string>
+ <string name="you_paid_ldollars_gift">
+ 你支付L$[AMOUNT]給[NAME]:[REASON]
+ </string>
<string name="you_paid_ldollars_no_info">
你支付了 L$[AMOUNT]。
</string>
@@ -4493,6 +4552,9 @@ http://secondlife.com/viewer-access-faq
<string name="you_paid_failure_ldollars">
你支付 L$[AMOUNT] 給 [NAME] 時出錯:[REASON]。
</string>
+ <string name="you_paid_failure_ldollars_gift">
+ 你支付L$[AMOUNT]給[NAME]時出錯:[REASON]
+ </string>
<string name="you_paid_failure_ldollars_no_info">
你支付 L$[AMOUNT] 時出錯。
</string>
@@ -4819,6 +4881,15 @@ http://secondlife.com/viewer-access-faq
<string name="texture_load_dimensions_error">
無法載入圖像大於 [WIDTH]*[HEIGHT]
</string>
+ <string name="outfit_photo_load_dimensions_error">
+ 裝扮的最大照片大小是[WIDTH]*[HEIGHT]。 請變更尺寸或使用另一個圖像
+ </string>
+ <string name="outfit_photo_select_dimensions_error">
+ 裝扮的最大照片大小是[WIDTH]*[HEIGHT]。 請選擇另一個材質
+ </string>
+ <string name="outfit_photo_verify_dimensions_error">
+ 無法驗證相片尺寸。 請等挑選器顯示相片尺寸再試
+ </string>
<string name="words_separator" value=","/>
<string name="server_is_down">
儘管我們努力避免,還是發生意料外的錯誤。
@@ -5335,6 +5406,9 @@ http://secondlife.com/viewer-access-faq
<string name="Command_Profile_Label">
檔案
</string>
+ <string name="Command_Report_Abuse_Label">
+ 違規舉報
+ </string>
<string name="Command_Search_Label">
搜尋
</string>
@@ -5425,6 +5499,9 @@ http://secondlife.com/viewer-access-faq
<string name="Command_Profile_Tooltip">
編輯或察看你的小檔案
</string>
+ <string name="Command_Report_Abuse_Tooltip">
+ 違規舉報
+ </string>
<string name="Command_Search_Tooltip">
尋找地點、活動、其他人
</string>
diff --git a/indra/newview/tests/llremoteparcelrequest_test.cpp b/indra/newview/tests/llremoteparcelrequest_test.cpp
index ea5014a59c..4f7f87b6b0 100644
--- a/indra/newview/tests/llremoteparcelrequest_test.cpp
+++ b/indra/newview/tests/llremoteparcelrequest_test.cpp
@@ -34,6 +34,7 @@
#include "../llagent.h"
#include "message.h"
#include "llurlentry.h"
+#include "llpounceable.h"
namespace {
const LLUUID TEST_PARCEL_ID("11111111-1111-1111-1111-111111111111");
@@ -62,7 +63,7 @@ void LLMessageSystem::addUUID(char const *,LLUUID const &) { }
void LLMessageSystem::addUUIDFast(char const *,LLUUID const &) { }
void LLMessageSystem::nextBlockFast(char const *) { }
void LLMessageSystem::newMessage(char const *) { }
-LLMessageSystem * gMessageSystem;
+LLPounceable<LLMessageSystem*, LLPounceableStatic> gMessageSystem;
char const* const _PREHASH_AgentID = 0; // never dereferenced during this test
char const* const _PREHASH_AgentData = 0; // never dereferenced during this test
LLAgent gAgent;
diff --git a/indra/newview/tests/test_llxmlrpc_peer.py b/indra/newview/tests/test_llxmlrpc_peer.py
index 281b72a058..cff40aa4c2 100755
--- a/indra/newview/tests/test_llxmlrpc_peer.py
+++ b/indra/newview/tests/test_llxmlrpc_peer.py
@@ -31,15 +31,23 @@ $/LicenseInfo$
import os
import sys
-from threading import Thread
from SimpleXMLRPCServer import SimpleXMLRPCServer
mydir = os.path.dirname(__file__) # expected to be .../indra/newview/tests/
-sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python"))
-sys.path.insert(1, os.path.join(mydir, os.pardir, os.pardir, "llmessage", "tests"))
+sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "llmessage", "tests"))
from testrunner import freeport, run, debug
class TestServer(SimpleXMLRPCServer):
+ # This server_bind() override is borrowed and simplified from
+ # BaseHTTPServer.HTTPServer.server_bind(): we want to capture the actual
+ # server port. BaseHTTPServer.HTTPServer.server_bind() stores the actual
+ # port in a server_port attribute, but SimpleXMLRPCServer isn't derived
+ # from HTTPServer. So do it ourselves.
+ def server_bind(self):
+ """Override server_bind to store the server port."""
+ SimpleXMLRPCServer.server_bind(self)
+ self.server_port = self.socket.getsockname()[1]
+
def _dispatch(self, method, params):
try:
func = getattr(self, method)
@@ -67,15 +75,21 @@ class TestServer(SimpleXMLRPCServer):
pass
if __name__ == "__main__":
- # Instantiate a TestServer on the first free port in the specified port
- # range. Doing this inline is better than in a daemon thread: if it blows
- # up here, we'll get a traceback. If it blew up in some other thread, the
- # traceback would get eaten and we'd run the subject test program anyway.
- xmlrpcd, port = freeport(xrange(8000, 8020),
- lambda port: TestServer(('127.0.0.1', port)))
+ # function to make a server with specified port
+ make_server = lambda port: TestServer(('127.0.0.1', port))
+
+ if not sys.platform.startswith("win"):
+ # Instantiate a TestServer on a port chosen by the runtime.
+ xmlrpcd = make_server(0)
+ else:
+ # "Then there's Windows"
+ # Instantiate a TestServer on the first free port in the specified
+ # port range.
+ xmlrpcd, port = freeport(xrange(8000, 8020), make_server)
+
# Pass the selected port number to the subject test program via the
# environment. We don't want to impose requirements on the test program's
# command-line parsing -- and anyway, for C++ integration tests, that's
# performed in TUT code rather than our own.
- os.environ["PORT"] = str(port)
- sys.exit(run(server=Thread(name="xmlrpc", target=xmlrpcd.serve_forever), *sys.argv[1:]))
+ os.environ["PORT"] = str(xmlrpcd.server_port)
+ sys.exit(run(server_inst=xmlrpcd, *sys.argv[1:]))
diff --git a/indra/test/message_tut.cpp b/indra/test/message_tut.cpp
index 8718360f0c..76063e6db1 100644
--- a/indra/test/message_tut.cpp
+++ b/indra/test/message_tut.cpp
@@ -103,7 +103,7 @@ namespace tut
~LLMessageSystemTestData()
{
// not end_messaging_system()
- delete gMessageSystem;
+ delete static_cast<LLMessageSystem*>(gMessageSystem);
gMessageSystem = NULL;
// rm contents of temp dir
diff --git a/scripts/content_tools/anim_tool.py b/scripts/content_tools/anim_tool.py
index 9b795f45fd..77bf731ae6 100644
--- a/scripts/content_tools/anim_tool.py
+++ b/scripts/content_tools/anim_tool.py
@@ -406,8 +406,13 @@ class Anim(object):
def delete_joint(self, name):
j = self.find_joint(name)
if j:
+ if args.verbose:
+ print "removing joint", name
anim.joints.remove(j)
anim.num_joints = len(self.joints)
+ else:
+ if args.verbose:
+ print "joint not found to remove", name
def summary(self):
nj = len(self.joints)
@@ -500,9 +505,9 @@ def resolve_joints(names, skel_tree, lad_tree):
for elt in all_elts:
if elt.get("name") is None:
continue
- print elt.get("name"),"hud",elt.get("hud")
+ #print elt.get("name"),"hud",elt.get("hud")
if args.no_hud and elt.get("hud"):
- print "skipping hud joint", elt.get("name")
+ #print "skipping hud joint", elt.get("name")
continue
if elt.get("name") in names or elt.tag in names:
matches.append(elt.get("name"))
@@ -532,6 +537,8 @@ if __name__ == "__main__":
parser.add_argument("--lad", help="name of the avatar_lad file", default= os.path.join(path_to_skel,"avatar_lad.xml"))
parser.add_argument("--set_version", nargs=2, type=int, help="set version and sub-version to specified values")
parser.add_argument("--no_hud", help="omit hud joints from list of attachments", action="store_true")
+ parser.add_argument("--base_priority", help="set base priority", type=int)
+ parser.add_argument("--joint_priority", help="set joint priority for all joints", type=int)
parser.add_argument("infilename", help="name of a .anim file to input")
parser.add_argument("outfilename", nargs="?", help="name of a .anim file to output")
args = parser.parse_args()
@@ -591,6 +598,13 @@ if __name__ == "__main__":
if args.set_version:
anim.version = args.set_version[0]
anim.sub_version = args.set_version[1]
+ if args.base_priority is not None:
+ print "set base priority",args.base_priority
+ anim.base_priority = args.base_priority
+ if args.joint_priority is not None:
+ print "set joint priority",args.joint_priority
+ for joint in anim.joints:
+ joint.joint_priority = args.joint_priority
if args.dump:
anim.dump(args.dump)
if args.summary: